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。