最近在開發記錄感想功能的時候用到了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
不出意外的話,這個item
的id
會是1
業務**如下:
}}就是對id==1
的item
新增/修改/刪除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...