我想首先使用Entity Framework代码来通过引用同一个表的主键来创建外键。请运行SQL以了解要求,尽管我最好把它放好。
我有一个User
类/模型,其属性为UserId
(主键),现在我希望另外两个属性CreatedBy
和UpdatedBy
都是外来的相同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
答案 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);
}
}