0

ASP.NETMVC3コードファーストでEntityFrameworkを使用しています。

私は次のようなプロジェクトエンティティとロゴを持っています:

public class Project
{
    [Key]
    public int      ProjectID   { get; set; }
    public string   Name        { get; set; }
    public string   Description { get; set; }        

    public virtual  Logo Logo   { get; set; }
}

public class Logo
{
    [Key]
    public int    LogoID          { get; set; }
    public string LogoName        { get; set; }
    public byte[] LogoContent     { get; set; }
    public string LogoContentType { get; set; }
}

各プロジェクトには、0または1つのロゴを付けることができます。

データベース(SQLサーバー)を作成すると、ロゴを参照するためのフィールドがプロジェクトテーブルに作成されていることがわかります。

ここに画像の説明を入力してください

プロジェクトテーブルにロゴを参照するプロジェクトがある場合は常に、Logo_LogoIDにロゴテーブルの対応するキーを入力します。それは私にとっては大丈夫です。私にとって奇妙に思えるのは、ロゴを削除すると、SQLサーバーに以下のエラーが表示されることです。

ここに画像の説明を入力してください

したがって、ロゴテーブルからロゴを削除できるようにするには、最初にプロジェクトテーブルから参照を解除し(LogoIDをNULLに置き換えることにより)、次にロゴから行を削除する必要があります。

多分物事を参照するより良い方法がありますか?

これはばかげた質問に思えるかもしれません。

より良い解決策は、逆の関係、つまりロゴテーブルに追加されたProjectIDフィールドを持つことだと思います。そのため、ロゴを削除する必要があるときはいつでも、ロゴを簡単に削除できます。

どう思いますか?

ありがとう。

編集

Mark Oretaが提案するように、私は次のことを試しました。

        modelBuilder.Entity<Project>()
            .HasOptional(p => p.Logo)
            .WithOptionalPrincipal(); 

しかし、ProjectIDへの二重参照を取得しました。

ここに画像の説明を入力してください

なぜですか?

4

1 に答える 1

0

DbContextのOnModelCreatingを次のように上書きすることで、マッピングを変更できます。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Project>()
            .HasOptional(p => p.Logo)
            .WithOptionalPrincipal();
    }

これにより、ロゴエンティティにProject_ProjectIDが作成されます。

名前をカスタマイズしたい場合-あなたはそれで大丈夫だと言いましたが、後でそれを変更したいかもしれません、あなたはこれを最後に追加することができます:

.Map(m => m.MapKey("ProjectId")

ロゴエンティティのProjectIdにマップされます。

于 2012-08-21T18:10:26.970 に答える