Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
Sql 实体框架通过引用同一表的主键来创建外键_Sql_Entity Framework_Entity Framework 6 - Fatal编程技术网

Sql 实体框架通过引用同一表的主键来创建外键

Sql 实体框架通过引用同一表的主键来创建外键,sql,entity-framework,entity-framework-6,Sql,Entity Framework,Entity Framework 6,我想首先使用实体框架代码通过引用同一表的主键来创建外键。请运行SQL以了解需求,不过最好让我来说明一下 我有一个User类/模型,它有一个属性UserId(主键),现在我想有另外两个属性CreatedBy和UpdatedBy作为同一User表的UserId外键 表格结构 UserID(PK,int,not null) FirstName LastName UpdatedBy CreatedBy(FK,int,not null) -- FK to UserId UpdatedBy(FK,int,

我想首先使用实体框架代码通过引用同一表的主键来创建外键。请运行SQL以了解需求,不过最好让我来说明一下

我有一个
User
类/模型,它有一个属性
UserId
(主键),现在我想有另外两个属性
CreatedBy
UpdatedBy
作为同一
User
表的
UserId
外键

表格结构

UserID(PK,int,not null)
FirstName
LastName
UpdatedBy
CreatedBy(FK,int,not null) -- FK to UserId
UpdatedBy(FK,int, not null)  -- FK to UserId   
SQL供参考

CREATE TABLE [dbo].[User]
(
    [UserId] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](50) NOT NULL,
    [LastName] [nvarchar](50) NOT NULL,
    [Email] [nvarchar](50) NOT NULL,
    [CreatedBy] [int] NULL,
    [UpdatedBy] [int] NULL,

    CONSTRAINT [PK_tbl_User] PRIMARY KEY CLUSTERED ([UserId] ASC)
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[User] WITH NOCHECK 
ADD CONSTRAINT [FK_tbl_User_CreatedBy] 
FOREIGN KEY([CreatedBy]) REFERENCES [dbo].[User] ([UserId])
GO

ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_tbl_User_CreatedBy]
GO

ALTER TABLE [dbo].[User] WITH NOCHECK 
ADD CONSTRAINT [FK_tbl_User_UpdatedBy] 
FOREIGN KEY([UpdatedBy]) REFERENCES [dbo].[User] ([UserId])
GO

ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_tbl_User_UpdatedBy]
GO

我猜想,您的问题在于不可为空的外键

如果没有其他用户创建新用户,您将无法添加该用户。那么如何插入第一个用户呢

删除用户似乎同样困难。外键引用必须设置为null或级联删除。Null不是选项,因为引用字段标记为“not Null”。因此,delete命令将级联,理论上,最终从表中删除所有条目。直到第一个用户,无法删除,因为没有创建第一个用户的用户

没有数据库管理系统会/应该允许这样的数据库设计

public class User {

    public int UserId {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public Nullable<int> CreatedByRef {get; set;}
    public Nullable<int> UpdatedByRef {get; set;}

    public virtual User CreatedBy {get; set;}
    public virtual User UpdatedBy {get; set;}

}

public class UserMap : EntityTypeConfiguration<User> {

    public UserMap() {

        ToTable("Users");

        HasKey(t=>t.UserId);

        HasOptional(t=>t.CreatedBy).WithMany().HasForeignKey(t=>t.CreatedByRef);
        HasOptional(t=>t.UpdatedBy).WithMany().HasForeignKey(t=>t.UpdatedByRef);

    }

}
公共类用户{
public int UserId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共可空CreatedByRef{get;set;}
公共可为Null的UpdatedByRef{get;set;}
公共虚拟用户通过{get;set;}创建
公共虚拟用户由{get;set;}更新
}
公共类UserMap:EntityTypeConfiguration{
公共用户映射(){
ToTable(“用户”);
HasKey(t=>t.UserId);
HasOptional(t=>t.CreatedBy).WithMany().HasForeignKey(t=>t.CreatedByRef);
HasOptional(t=>t.UpdatedBy).WithMany().HasForeignKey(t=>t.UpdatedByRef);
}
}

那么您遇到的实际问题是什么呢?我会将CreatedBy和UpdatedBy设置为null,因为您可能会在为第一个用户设置CreatedBy时遇到麻烦。如果还没有更新,UpdatedBy也可能为null。无法指向具有not nullable约束的同一用户。请先显示您的现有代码。