【问题标题】:Entity Framework create a foreign key by referencing primary key of the same table实体框架通过引用同一张表的主键创建外键
【发布时间】:2014-06-17 15:43:56
【问题描述】:

我想使用实体框架代码优先通过引用同一个表的主键来创建外键。请运行 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

【问题讨论】:

  • 那么您遇到的实际问题是什么?
  • 我会让 CreatedBy 和 UpdatedBy 为空,因为您可能会在为第一个用户设置 CreatedBy 时遇到麻烦。如果还没有更新,UpdatedBy 也可能为 null。不能指向具有不可空约束的同一个用户。
  • 先向我们展示您现有的代码。

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


【解决方案1】:

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

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

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

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

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多