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

时间:2014-06-17 06:46:15

标签: sql entity-framework entity-framework-6

我想首先使用Entity Framework代码来通过引用同一个表的主键来创建外键。请运行SQL以了解要求,尽管我最好把它放好。

我有一个User类/模型,其属性为UserId(主键),现在我希望另外两个属性CreatedByUpdatedBy都是外来的相同UserId表格的User的关键字

表格结构

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

1 个答案:

答案 0 :(得分:0)

我怀疑,你的问题在于不可为空的外键。

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

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

没有DBMS会/应该允许像这样的数据库设计。

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);

    }

}