【问题标题】:Multiple foreign key of the same type in Entity Framework实体框架中相同类型的多个外键
【发布时间】:2019-02-14 08:19:28
【问题描述】:

我有 Issue 实体有 2 个字段作为 FKUser 实体,如下所示。尽管我正确配置了属性以防止创建额外的Xxx_Id 字段而不是PropertyNameId,但除了PropertyNameId 字段之外,表中还创建了一个Xxx_Id 字段。在此示例中,除了 AssigneeIdReporterId 字段之外,Issue 表中还创建了 User_Id 字段。这里有什么错误吗? User 实体中的 HashSet 是否会导致这个额外的 User_Id 字段?

问题:

public class Issue : BaseEntity
{
    [Key]
    public int Id { get; set; }

    //Foreign key for Reporter (User entity)
    public short ReporterId { get; set; }

    //Foreign key for Assignee (User entity)
    public short AssigneeId { get; set; }

    [ForeignKey("ReporterId")]
    public virtual User Reporter { get; set; }

    [ForeignKey("AssigneeId")]
    public virtual User Assignee { get; set; }
}

用户:

public class User : BaseEntity 
{
    [Key]
    public short Id { get; set; }

    public string UserName { get; set; }

    public string Email { get; set; }

    //code omitted for brevity 

    public User()
    {
        Issues = new HashSet<Issue>();
        //code omitted for brevity 
    }        

    public virtual ICollection<Issue> Issues { get; set; }

    //code omitted for brevity 
}

以下是迁移文件中的相关行:

CreateTable(
            "Issue",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    ReporterId = c.Short(nullable: false),
                    AssigneeId = c.Short(nullable: false),
                    User_Id = c.Short() //???
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("com.User", t => t.User_Id)  //???
            .ForeignKey("com.User", t => t.AssigneeId)
            .ForeignKey("com.User", t => t.ReporterId)
            .Index(t => t.ReporterId)
            .Index(t => t.AssigneeId)
            .Index(t => t.User_Id);  //???

【问题讨论】:

  • 可以发BaseEntity类的内容吗?
  • 有你的问题!我正在彻底回答。
  • @NguyenThanh 我添加了,谢谢...
  • @TanvirArjel 非常感谢,我正在等待您的回复...

标签: c# sql-server asp.net-mvc entity-framework ef-code-first


【解决方案1】:

当您尝试创建多个相同类型的ForeignKey 时,所以 您设置的模型类应如下所示:

public class User : BaseEntity
{
    public User()
    {
        ReporterIssues = new HashSet<Issue>();
        AssigneeIssues = new HashSet<Issue>();
    }

    [Key]
    public short Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }

    // Navigation properties
    public virtual ICollection<Issue> ReporterIssues { get; set; }
    public virtual ICollection<Issue> AssigneeIssues { get; set; }
}

public class Issue : BaseEntity
{
    [Key]
    public int Id { get; set; }
    public short ReporterId { get; set; }
    public short AssigneeId { get; set; }

    // Navigation properties
    public virtual User Reporter { get; set; }
    public virtual User Assignee { get; set; }
}

然后在OnModelCreating配置如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().HasMany(u => u.AssigneeIssues)
            .WithRequired(i => i.Assignee).HasForeignKey(a => a.AssigneeId)
            .WillCascadeOnDelete(false); // <-- cascade delete must be false

        modelBuilder.Entity<User>().HasMany(u => u.ReporterIssues)
            .WithRequired(i => i.Reporter).HasForeignKey(a => a.ReporterId)
            .WillCascadeOnDelete(false); // <-- cascade delete must be false
 }

【讨论】:

  • 非常感谢坦维尔。几年前我使用过[InverseProperty],你是对的,问题是使用多个相同类型的FK,这似乎解决了问题。在继续之前:1) 我可以使用您注释掉的 [InverseProperty] 并省略 OnModelCreating 部分吗?因为我以前用过[InverseProperty]这样的。任何的想法? 2) 如果我使用 OnModelCreating 部分,则不需要使用您注释掉的 [InverseProperty] 部分,是这样吗???
  • 您可以省略[InverseProperty ]。但OnModelCreating 必须关闭,因为级联删除必须关闭。查看我更新的答案并阅读代码注释。
  • 我已经从答案中删除了逆属性。
  • 只是好奇,我可以只使用 [InverseProperty] 方法而不是 OnModelCreating 方法并省略 OnModelCreating 部分吗?
  • 在这里阅读我以前的cmets!
猜你喜欢
  • 1970-01-01
  • 2021-10-05
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多