[英]Code First EF5: One-to-Zero-or-One relationship is not working
[英]EF code first - configure One-to-Zero-or-One relationship without shared PK/FK
我試圖在兩個實體之間建立一對零或一個關系,並且我希望從屬實體仍包含其自己的Indentity列,而不是作為共享密鑰。
我想盡可能多地遵循約定,而不要顯式聲明不需要顯式聲明的任何內容(因此,沒有不必要的數據注釋或流暢的api子句)
實體:
public class File
{
public int FileId {get;set;}
//some omitted file properties
public virtual Task Task {get;set;}
}
public class Task
{
public int TaskId {get;set;}
//some omitted task properties
public int FileId {get;set;}
public virtual File File {get;set;}
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<File>().HasOptional(f => f.Task).WithRequired(t => t.File);
base.OnModelCreating(modelBuilder);
}
這將創建一個奇怪的關系,其中TaskId既是Tasks表的PK列,也是FK列。 我認為該值應該與文件ID相同? (這是一個問題:)
因此,如何使TaskId保持其自己的順序值並使FileId成為Files表的外鍵?
也許在1-0..1的情況下,我寧願擺脫TaskId屬性,而將FileId設為PK / FK屬性?
干杯!
不支持具有顯式FK屬性的雙向one-to-one
關系。
因此,要么繼續使用您現在擁有的“ 共享主鍵”關聯 。 只需從Task
TaskId
或FileId
屬性之一,然后將其余的作為PK(EF將自動將其用作FK,因為這是默認的EF one-to-one
關系模型)。
或從Task
刪除FieldId
屬性,並使用以下流利的配置(所有步驟都是必需的):
modelBuilder.Entity<File>()
.HasOptional(f => f.Task)
.WithRequired(t => t.File)
.Map(m => m.MapKey("FileId"))
.WillCascadeOnDelete();
但是我建議使用第一種方法(如果沒有特殊的理由不像現有數據庫那樣使用它),因為它得到了更好的支持-第二種方法包括在SQL查詢中的一些LEFT OUTER JOIN
,您可以從EF這篇文章中看到- WithOptional-左外部聯接? 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.