Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架和相同的表外键_C#_Sql_Entity Framework - Fatal编程技术网

C# 实体框架和相同的表外键

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

要描述我想要的内容:假设我在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不会抛出任何错误

现在,如果我尝试先使用实体框架代码创建同一个表,我会得到混合的结果:

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值。您最好通过允许null
CreatedByUserId
来更改设计—这是解决此类问题的“标准”方法。我使用的是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值。您最好通过允许null
CreatedByUserId
来更改设计—这是解决此类问题的“标准”方法。我使用的是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
)。