EF Core 中處理 1對1 關係

2022-01-15 14:18:30 字數 3124 閱讀 9213

最近在開發記錄感想功能的時候用到了1對1的資料關係,具體情況是這樣的,有這樣兩個1對1的型別

public class item

public string title

public note note

}public class note

public string content

public int itemid

public item item

public bool deleted

}

它們的1對1關係配置如下:

protected override void onmodelcreating(modelbuilder modelbuilder)

);}

note是軟刪除的,這裡配置了乙個queryfilter

然後我們用dotnet-ef命令構建資料庫,生成的指令碼如下:

if object_id(n'[__efmigrationshistory]') is null

begin

create table [__efmigrationshistory] (

[migrationid] nvarchar(150) not null,

[productversion] nvarchar(32) not null,

constraint [pk___efmigrationshistory] primary key ([migrationid])

);end;

gocreate table [items] (

[id] int not null identity,

[title] nvarchar(max) null,

constraint [pk_items] primary key ([id])

);go

create table [notes] (

[id] int not null identity,

[content] nvarchar(max) null,

[itemid] int not null,

[deleted] bit not null,

constraint [pk_notes] primary key ([id]),

constraint [fk_notes_items_itemid] foreign key ([itemid]) references [items] ([id]) on delete cascade

);go

create unique index [ix_notes_itemid] on [notes] ([itemid]);

goinsert into [__efmigrationshistory] ([migrationid], [productversion])

values (n'20190813141425_initentities', n'2.2.6-servicing-10079');

go

再造一條資料,方便測試

use [demo]

goinsert into [dbo].[items]

([title])

values

('a')

go

不出意外的話,這個itemid會是1

業務**如下:

}}就是對id==1item新增/修改/刪除note

有這樣乙個很簡單的場景,使用者先新增了note,然後刪除note,再想新增note,這時候你就會發現資料庫報錯了:note違反了唯一性約束。

由於note是軟刪除的,所有當再次新增note的時候就會出現重複的itemid

解決這個問題的思路也很簡單,只需要把這個外來鍵的唯一性約束更改為過濾掉deleted的資料進行約束。

更改關係配置

protected override void onmodelcreating(modelbuilder modelbuilder)

]=0");

});}

給這個itemid的唯一性約束加乙個條件e.hasindex(x => x.itemid).isunique().hasfilter($"=0");

再用dotnet-ef命令生成的資料庫更新指令碼,如下:

drop index [ix_notes_itemid] on [notes];

gocreate unique index [ix_notes_itemid] on [notes] ([itemid]) where [deleted]=0;

goinsert into [__efmigrationshistory] ([migrationid], [productversion])

values (n'20190813144240_filterindex', n'2.2.6-servicing-10079');

go

用有條件的index替換了原先的index

現在再次執行先前的業務,新增,刪除,再次新增就正常了。

完整**github

efcore 一對一 一對多 多對多關係

public class user entity public string email public string phonenumber required datatype datatype.password public string password public datetime birt...

EFCore中如何移除主外來鍵關係

我用efcore寫了乙個blog程式,我要通過寫文章來分享自己的知識,我定義了乙個article用來存放文章資訊,我還定義了乙個category用來存放文章的分類,category與article是一對的關係。我的 實現如下 article public class article public i...

Spring iBatis 1對多表關係配置

sqlmapconfig.xml blogitem.xml select from blog items,blog categorys where categoryid blog categorys.id and id value blogcategory.xml select cate.id,ca...