Entity Frameworkコアの1対1の関係がSQL Serverで1対多に生成される

entity-framework-core

質問

このチュートリアルhttp://ef.readthedocs.io/en/latest/modeling/relationships.html#one-to-oneに基づくEntity Frameworkコア(rc1またはrc2)の1対1の関係の場合は、このコードを使用します:

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

しかし、移行を実行し、データベースをチェックした後、私は生成されたテーブルが次の関係を持っていることに気付きました:

ここに画像の説明を入力

解決策とは何ですか?

受け入れられた回答

BlogImageIdBlogImageの主キー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はこれらの2つのオブジェクト間に双方向の関連付けを行うことでこれを認識します。

唯一の問題は、EF Core BlogForeignKey列に一意の制約を作成することで、この1対1の関連付けをデータベースに変換できなかったことです。その結果、1対1の関係にマップされるオブジェクトモデル内の1対1の関連付けあなたのデータベースに。

これは、最終リリースで修正されるEFコアのバグです。

今度は共有プライマリキーアソシエーションを作成したい場合、@Gertによって提供される答えがありますが、独自の外部キー(BlogForeignKey)または基本的にOne-to -One Foreign Key Associationはコードを変更しないで、BlogForeignKeyカラムに一意の制約を手動で作成し、今月末までにリリースされる予定の RTMバージョンを待つだけです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ