Sql 实体框架通过引用同一表的主键来创建外键
我想首先使用实体框架代码通过引用同一表的主键来创建外键。请运行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,
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约束的同一用户。请先显示您的现有代码。