1

正如标题所说,我可以添加和更新,但在删除时出现错误。

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

我知道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();

视图模型:

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; }
}
4

1 回答 1

1

从这个答案中得到了解决方案

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。

于 2017-07-07T13:42:21.610 回答