实体框架和同一表外键

时间:2019-03-31 13:08:24

标签: c# sql entity-framework

要描述我想要的内容:假设我在SQL Server中有一个表User,其中包含主键字段和两个使用外键引用回同一表的字段。

CREATE TABLE [User] (
    ID INT IDENTITY(1, 1) NOT NULL,
    -- other properties omitted for brevity
    CreatedByUserID INT NOT NULL,
    LastModifiedByUserID INT NOT NULL,
    CONSTRAINT PK_User PRIMARY KEY (ID),
    CONSTRAINT FK_User_CreatedByUser FOREIGN KEY (CreatedByUserID) REFERENCES User 
(ID),
    CONSTRAINT FK_User_LastModifiedByUser FOREIGN KEY (LastModifiedByUserID) REFERENCES User (ID),
)

我可以通过执行以下SQL来设置“ root”用户:

INSERT [User] (CreatedByUserID, LastModifiedByUserID) VALUES (1, 1)

SQL Server不会引发任何错误。

现在,如果我尝试使用Entity Framework Code First创建相同的表,则会得到不同的结果:

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [ForeignKey(nameof(CreatedByUser))]
    public int CreatedByUserID { get; set; }

    //[ForeignKey(nameof(ModifiedByUser))]
    //public int ModifiedByUserID { get; set; }

    public virtual User CreatedByUser { get; set; }

    //public virtual User ModifiedByUser { get; set; }
}

如图所示,它起作用,但是当我取消注释ModifiedByUser *行时,我收到各种“多重性在角色中无效”错误。

我曾尝试将注释驱动的类转换为流利的配置,但是运行Add-Migration时我并不走运:总是会出现一些错误,这些错误会导致配置方法的某些组合出现,我似乎永远无法指定CreatedByUserIDLastModifiedByUserID列名。

user.HasRequired(x => x.CreatedBy);
    //.WithRequiredPrincipal();
user.HasRequired(x => x.LastModifiedBy);
    //.WithRequiredPrincipal();

我是否要尝试执行实体框架禁止的操作?还是我错过了一两行配置?如何使用EF重新创建本文顶部显示的表结构?

编辑: 相同的模式对于模型中的许多其他实体也很好:例如,WorkItem可以同时具有CreatedByUserModifiedByUser;仅当外键引用回与其封闭类型相同的实体时,问题才出现。

0 个答案:

没有答案