要描述我想要的内容:假设我在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
时我并不走运:总是会出现一些错误,这些错误会导致配置方法的某些组合出现,我似乎永远无法指定CreatedByUserID
或LastModifiedByUserID
列名。
user.HasRequired(x => x.CreatedBy);
//.WithRequiredPrincipal();
user.HasRequired(x => x.LastModifiedBy);
//.WithRequiredPrincipal();
我是否要尝试执行实体框架禁止的操作?还是我错过了一两行配置?如何使用EF重新创建本文顶部显示的表结构?
编辑:
相同的模式对于模型中的许多其他实体也很好:例如,WorkItem
可以同时具有CreatedByUser
和ModifiedByUser
;仅当外键引用回与其封闭类型相同的实体时,问题才出现。