1 回答

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
正如我所說,如果我注釋掉 Id 一切正常,但我不需要對 UserDetails 進(jìn)行 PK
如果我理解正確,您只是不想添加額外的列(例如,Id或UserDetailsId)設(shè)置為 PK 。UserDetails您要創(chuàng)建的表將有一個(gè)引用UserId該表的User表,并且UserId將同時(shí)用作主鍵和外鍵。
事實(shí)上,沒有必要擁有entity的Id屬性。UserDetails那么為什么你的代碼不起作用呢?原因是您混淆了從屬實(shí)體和主體實(shí)體。
HasForeignKey<>()方法的原型是:
public virtual ReferenceReferenceBuilder<TEntity,TRelatedEntity> HasForeignKey<TDependentEntity>
(
Expression<Func<TDependentEntity,object>> foreignKeyExpression
)
where TDependentEntity : class;
HasForeignKey<TDependentEntity>()注意代表依賴實(shí)體的通用參數(shù)。
這是你的代碼:
builder.Entity<User>(entity =>
{
entity.HasOne(d => d.UserDetail)
.WithOne(p => p.User)
.HasForeignKey<UserDetails>(x => x.UserId);
});
看到了嗎?在您的代碼中,entity這里是UserPrincipal Entity 而不是 Dependent Entity。要修復(fù)它,請更改您的代碼,如下所示:
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<User>(entity =>
{
entity.HasOne(u => u.UserDetail).WithOne(d => d.User);
});
builder.Entity<UserDetails>(entity =>
{
// set the UserId as key
entity.HasKey(d=>d.UserId);
// the relationship between `UserDetails : User` is 1-to-1
entity.HasOne(d=>d.User).WithOne(u=>u.UserDetail)
// set column `UserId` as the FK for the dependent entity , i.e. , the `UserDetails` .
.HasForeignKey<UserDetails>(u=>u.UserId);
});
}
它將同時(shí)生成一個(gè)列設(shè)置為 PrimaryKey 和 ForeignKey 的UserDetails表:UserId
CREATE TABLE [dbo].[UserDetails] (
[Biography] NVARCHAR (MAX) NULL,
[Country] NVARCHAR (MAX) NULL,
[FacebookLink] NVARCHAR (MAX) NULL,
[TwitterLink] NVARCHAR (MAX) NULL,
[SkypeLink] NVARCHAR (MAX) NULL,
[UserId] NVARCHAR (450) NOT NULL,
CONSTRAINT [PK_UserDetails] PRIMARY KEY CLUSTERED ([UserId] ASC),
CONSTRAINT [FK_UserDetails_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE
);
順便說一句,Visual Studio 的 SQL Server 對象資源管理器中似乎存在一個(gè)錯(cuò)誤(請參閱我的問題here),導(dǎo)致我們無法看到已經(jīng)存在的 FK 約束的錯(cuò)誤。
但是,我們可以通過嘗試使用不存在的 UserId 插入一行來證明這一點(diǎn):
insert into UserDetails
(Biography,UserId)
values
('hello,wrold','here-is-a-non-existing-user-id')
它將按預(yù)期抱怨以下消息:
消息 547,第 16 級,狀態(tài) 0,第 1 行
INSERT 語句與 FOREIGN KEY 約束“FK_UserDetail_AspNetUsers_UserId”沖突。沖突發(fā)生在數(shù)據(jù)庫“App-EFCore-FK-Test”、表“dbo.AspNetUsers”、“Id”列中。
該語句已終止。
- 1 回答
- 0 關(guān)注
- 153 瀏覽
添加回答
舉報(bào)