實體框架核心一對一關係在SQL Server中生成一對多

entity-framework-core

對於基於本教程http://ef.readthedocs.io/en/latest/modeling/relationships.html#one-to-one的實體框架核心(rc1或rc2)中的一對一關係,我使用此代碼:

public 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; }
}

但是在運行遷移並檢查數據庫之後,我注意到生成的表具有以下關係:

在此處輸入圖像描述

什麼是解決方案?

一般承認的答案

BlogImageId應該是BlogImage的主鍵 Blog的外鍵:

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

    public Blog Blog { get; set; }
}

modelBuilder.Entity<Blog>()
    .HasOne(p => p.BlogImage)
    .WithOne(i => i.Blog)
    .HasForeignKey<BlogImage>(b => b.BlogImageId); // BlogImageId is FK

熱門答案

您的代碼看起來很好,實際上您在BlogBlogImage對象之間創建了1:1關係,而EF Core通過允許您在這兩個對象之間實現雙向關聯來識別這一點。

唯一的問題是EF Core 無法通過在BlogForeignKey列上創建唯一約束來將此一對一轉換為數據庫,因此您在對像模型中具有一對一關聯,該關聯映射到一對多關係在你的數據庫中。

這是EF Core中的一個Bug ,將在最終版本中修復。

現在,如果你想創建一個共享主鍵關聯,那麼@Gert提供的答案是要走的路,但如果你的意圖是在一個唯一的外鍵(即BlogForeignKey)上創建你的一對一關聯,或者基本上是一對一-然後一個外鍵關聯不會更改您的代碼,只需在BlogForeignKey列上手動創建一個唯一約束,並等待計劃在本月底之前發布的RTM版本。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow