簡體   English   中英

C#實體框架6-AutoMapper 6-集合/列表-添加和更新有效,但刪除項目會引發錯誤

[英]C# Entity Framework 6 - AutoMapper 6 - Collections/List - Add and Update works but removing item throws an error

如標題所述,我可以添加和更新,但是在刪除時會出現錯誤。

操作失敗:由於一個或多個外鍵屬性不可為空,因此無法更改該關系。 對關系進行更改時,相關的外鍵屬性將設置為空值。 如果外鍵不支持空值,則必須定義新的關系,必須為外鍵屬性分配另一個非空值,或者必須刪除不相關的對象。

我了解在這種情況下, Description僅獲得一個空外鍵,但從未刪除。 我已經看到了一些示例,它們建議遍歷每個子項並逐個刪除它們。 今井我認為應該有更好的辦法。 我正在尋找的是一種影響最小的解決方案,只需告訴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; }
}

從這個答案中得到了解決方案

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關於組合聚合之間差異的答案 ,因為它可以幫助您更好地了解EF。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM