【问题标题】:EF Core error update-database when dependent entity has multiple reference to parent entity当依赖实体对父实体有多个引用时,EF Core 错误更新数据库
【发布时间】:2018-04-14 23:55:26
【问题描述】:

我是 EF Core 的新手。我有两个表,这两个表几乎类似于以下两个表,如下所示:

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int AuthorId { get; set; }
    public User Author { get; set; }

    public int ContributorId { get; set; }
    public User Contributor { get; set; }
}

public class User
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [InverseProperty("Author")]
    public List<Post> AuthoredPosts { get; set; }

    [InverseProperty("Contributor")]
    public List<Post> ContributedToPosts { get; set; }
}

当我运行 update-database 命令时,我收到以下错误

Introducing FOREIGN KEY constraint 'FK_Post_User_AuthorId' on table 'Post' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

谁能帮助我做错了什么以及如何以最好的方式解决这个问题?

谢谢

【问题讨论】:

  • 如您所见,错误是关于WorkflowRules表,不涉及Post和User表。
  • 我只是以这些表格为例。无论如何,我已经更新了错误。

标签: visual-studio-2017 entity-framework-core asp.net-core-2.0


【解决方案1】:

Entity Framework 足够聪明,可以根据您的模型找出在生成表和它们之间的关系时可能出现的问题。

但这不是错误,这更像是一个警告,作为开发人员,您必须进行一些额外的配置才能生成正确的关系。这是由于这部分:

public int AuthorId { get; set; }
public User Author { get; set; }

public int ContributorId { get; set; }
public User Contributor { get; set; }

因为您使用相同的类型,所以必须指示User EF 在其中一个属性发生更改(创建、删除、更新)时如何操作。这也会发生,因为您可以为作者和贡献者拥有相同的Key,在这种情况下,EF 必须知道如何处理它。

解决方案很简单,添加一些额外的配置:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    // Relationships
    entity.HasOne(p => p.Author)
        .WithMany(p => p.AuthoredPosts)
        .HasForeignKey(p => p.AuthorId)
        .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Cascade);

    entity.HasOne(p => p.Contributor)
        .WithMany(p => p.ContributedToPosts)
        .HasForeignKey(p => p.ContributorId)
        .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Cascade);
}

您还可以指定更新发生时会发生什么。

【讨论】:

    猜你喜欢
    • 2019-11-11
    • 2022-10-18
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多