C# 实体框架和相同的表外键
要描述我想要的内容:假设我在SQL Server中有一个表C# 实体框架和相同的表外键,c#,sql,entity-framework,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
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不会抛出任何错误
现在,如果我尝试先使用实体框架代码创建同一个表,我会得到混合的结果:
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*行时,会出现各种“多重性在角色中无效”错误
我曾尝试将注释驱动类转换为流畅风格的配置,但在运行添加迁移时运气不佳:对于某些配置方法的组合,总是会出现一些错误,而且我似乎永远无法指定CreatedByUserID
或lastModifieddbyuserid
列名
user.HasRequired(x => x.CreatedBy);
//.WithRequiredPrincipal();
user.HasRequired(x => x.LastModifiedBy);
//.WithRequiredPrincipal();
我是否正在尝试做实体框架所禁止的事情?还是我错过了一两行配置?如何使用EF重新创建本文顶部显示的表结构
编辑:
同样的模式适用于模型中的许多其他实体:例如,WorkItem
可以同时具有CreatedByUser
和modifiedbyser
;只有当外键引用回与其封闭类型相同类型的实体时,问题才会出现。这在EF6中是不可能的(不确定EF Core),因为它忽略了自动生成键的显式PK值。您最好通过允许nullCreatedByUserId
来更改设计—这是解决此类问题的“标准”方法。我使用的是EF 6。允许两个外键中的一个(甚至两个)可以为null并不能解决我的问题。我尝试了注释和fluentapi。我得到了同样的错误,“因为依赖角色属性不是键属性,所以依赖角色的多重性的上限必须是'*'。你搞错了。可以流畅地配置模型-user.HasRequired(x=>x.CreatedBy).WithMany()
+user.HasRequired(x=>x.LastModifiedBy).WithMany()代码>。但是,如果CreatedByUserId
等于SQL示例中相同的User
Id,则无法创建User
(除非您直接使用SQL并启用了identity\u insert
)。这在EF6中是不可能的(不确定EF Core),因为它忽略了自动生成密钥的显式PK值。您最好通过允许nullCreatedByUserId
来更改设计—这是解决此类问题的“标准”方法。我使用的是EF 6。允许两个外键中的一个(甚至两个)可以为null并不能解决我的问题。我尝试了注释和fluentapi。我得到了同样的错误,“因为依赖角色属性不是键属性,所以依赖角色的多重性的上限必须是'*'。你搞错了。可以流畅地配置模型-user.HasRequired(x=>x.CreatedBy).WithMany()
+user.HasRequired(x=>x.LastModifiedBy).WithMany()代码>。但是,如果CreatedByUserId
等于SQL示例中相同的User
Id,则无法创建User
(除非您直接使用SQL并启用了identity\u insert
)。