8

如何在實體框架7中配置一對一或零或一對一關係代碼首先使用數據註釋或流利API?實體框架中的一對一關係7代碼優先

+1

閱讀這篇文章(http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx) –

回答

20

可以在實體框架7使用流利的API定義OneToOne關係如下

class MyContext : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<BlogImage> BlogImages { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Blog>() 
      .HasOne(p => p.BlogImage) 
      .WithOne(i => i.Blog) 
      .HasForeignKey<BlogImage>(b => b.BlogForeignKey); 
    } 
} 

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Url { get; set; } 

    public BlogImage BlogImage { get; set; } 
} 

public class BlogImage 
{ 
    public int BlogImageId { get; set; } 
    public byte[] Image { get; set; } 
    public string Caption { get; set; } 

    public int BlogForeignKey { get; set; } 
    public Blog Blog { get; set; } 
} 
+0

而一些不明顯的如果你希望BlogImage與Blog有一個到零或一個關係,而不是一對一(也就是說它自己有一個BlogImage,可選擇的沒有引用一個Blog,你只需要使BlogImage.BlogForeignKey爲空即可,如下所示:public int?BlogForeignKey {get; set;} –

+2

這個屬性真的需要嗎?'public int BlogForeignKey {get; set;}' –

2

以上的答案是絕對正確的。

只是爲了讀者的信息:這已經很好地在official documentation

1對一個

一對一的關係解釋有兩面參考導航屬性。它們遵循與一對多關係相同的約定,但是在外鍵屬性上引入了唯一索引,以確保只有一個依賴關係與每個主體關聯。

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Url { get; set; } 

    public BlogImage BlogImage { get; set; } 
} 

public class BlogImage 
{ 
    public int BlogImageId { get; set; } 
    public byte[] Image { get; set; } 
    public string Caption { get; set; } 

    public int BlogId { get; set; } 
    public Blog Blog { get; set; } 
} 

注意

EF會選擇實體之一是基於它能夠探測到一個外鍵屬性能力的依賴。如果選擇了錯誤的實體作爲依賴項,則可以使用Fluent API來更正此問題。

+2

我真的需要定義這個屬性嗎?'public int BlogId {get; set;}' –

+1

@MohammedNoureldin屬性'public int BlogId {get; set;}'是需要的,因爲''EF會選擇一個實體根據其檢測外鍵屬性的能力成爲依賴關係。「請參閱一對一部分中https://docs.microsoft.com/en-us/ef/core/modeling/relationships中的說明。其他關係模式。 –

相關問題