簡體   English   中英

EF代碼優先-在不共享PK / FK的情況下配置一對零或一對關系

[英]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 TaskIdFileId屬性之一,然后將其余的作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM