0

由于标题说我可以添加和更新,但是当涉及到删除我得到一个错误。C#实体框架6 - AutoMapper 6 - 集合/列表 - 添加和更新的作品,但删除项目会引发错误

操作失败:无法更改关系,因为 一个或多个外键属性是不可空的。当 更改为关系时,相关的外键属性 设置为空值。如果外键不支持空值,则必须定义一个新的关系,外键属性必须为 分配另一个非空值,或者无关对象必须为 删除。

据我所知,Description在这种情况下只获得一个空外键,但从不删除。我看过一些例子,他们建议循环浏览每个子项目并逐个删除它们。 Imao我认为应该有更好的方法。我在寻找的是一个影响最小的解决方案,只告诉EF删除整个项目,而不仅仅是将外键归零。

https://stackoverflow.com/a/5540956/3850405

使用AutoMapper,AutoMapper.Collection和AutoMapper.Collection.EntityFramework。

控制器方法:

public async Task<IHttpActionResult> UpdateArticle(ArticleViewModel articleVm) 
{ 
    Article articleOriginal = await iArticleRepository.GetAsync(articleVm.Id); 
    Article updatedArticle = Mapper.Map<ArticleViewModel, Article>(articleVm, articleOriginal); 
    await iArticleRepository.UpdateAsync(updatedArticle); 
    return Ok(); 
} 

映射:

Mapper.Initialize(cfg => 
{ 
    cfg.AddCollectionMappers(); 

    cfg.SetGeneratePropertyMaps<GenerateEntityFrameworkPrimaryKeyPropertyMaps<DbContext>>(); 

    cfg.CreateMap<ArticleViewModel, Article>(MemberList.Source) 
     .EqualityComparison((src, dst) => src.Id == dst.Id); 

    cfg.CreateMap<DescriptionViewModel, Description>(MemberList.Source) 
     .EqualityComparison((src, dst) => src.Id == dst.Id); 
} 
Mapper.AssertConfigurationIsValid(); 

的ViewModels:

public class ArticleViewModel 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public List<DescriptionViewModel> Descriptions { get; set; } 
} 

public class DescriptionViewModel 
{ 
    public int Id { get; set; } 

    public string Heading { get; set; } 
} 

型号:

public class Article : IEntity<int> 
{ 
    public Article() 
    { 
     Descriptions = new List<Description>(); 
    } 

    [Key] 
    public int Id { get; set; } 

    public DateTime Created { get; set; } 

    public DateTime Updated { get; set; } 

    [MaxLength(256)] 
    public string Name { get; set; } 

    public virtual ICollection<Description> Descriptions { get; set; } 
} 

public class Description: IEntity<int> 
{ 
    [Key] 
    public int Id { get; set; } 

    public DateTime Created { get; set; } 

    public DateTime Updated { get; set; } 

    [MaxLength(256)] 
    public string Heading { get; set; } 

    public int ArticleId { get; set; } 

    public virtual Article Article { get; set; } 
} 

回答

0

得到了这样的回答

https://stackoverflow.com/a/32983252/3850405

一个解决方案,这个博客:

http://www.kianryan.co.uk/2013/03/orphaned-child/

代码:

public class Description: IEntity<int> 
{ 
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public DateTime Created { get; set; } 

    public DateTime Updated { get; set; } 

    [MaxLength(256)] 
    public string Heading { get; set; } 

    [Key, Column(Order = 1)] 
    public int ArticleId { get; set; } 

    public virtual Article Article { get; set; } 
} 

我真的可以推荐阅读Mosh's answer之间的区别组成聚合因为它会帮助你更好地理解EF。