3

Entity Framework バージョン 4.0 (または .NET 4.0 と互換性のあるその他のバージョン) を使用して、次の既存のリレーショナル データベース スキーマをマップします。

リレーショナル データベース スキーマ

この論理オブジェクト モデルに:

論理オブジェクト モデル

私は次のように設定しようとしました: (ドイツ語のキャプションが混乱しないことを願っています.)

<code>Foo</code> エンティティの Entity Framework のマッピングの詳細とその <code>B</code> プロパティの設定

Entity Framework で次のエラーが表示されます。

FooBs.Bエラー 3031: フラグメントのマッピングに問題があります …:テーブル内の null 非許容列がFooBsnull 許容エンティティ プロパティにマップされています。

論理モデルでは、Bnull 許容である必要があります。ただし、データベースでは別のテーブルに存在するため、そうではありません。(null 許容データベース列は避けたいと思います。)FoosFooBsが結合された場合にのみ null 許容になります (1:0..1 カーディナリティのため)。

データベース スキーマまたはオブジェクト モデルを変更せずにマッピングを修正するにはどうすればよいですか?


PS:この EF 6.0 コードファースト マッピングも試しました。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Foo>()
    .HasKey(f => f.Id)
    .Property(f => f.Id).HasColumnName("FooId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    modelBuilder.Entity<Foo>().Map(f => {
        f.Property(_ => _.A);
        f.ToTable("Foos");
    }).Map(f => {
        f.Property(_ => _.B);
        f.ToTable("FooBs");
    });
}

しかし、これも機能しません。データベースから読み取るとき、EF は にサブレコードがないすべてのレコードを無視しFooBsます。データベースに書き込むとき、プロパティが に設定されているすべてに対して挿入NULLを試みます。FooBs.BFooBnull

4

1 に答える 1

3

うまくいくはずのかなり「汚い」解決策があります。コードを変更する必要がありますが、FooエンティティにはフィールドAB.

Fooクラス:

class Foo {
   [Key]
   public int FooId { get; set; }
   public int A { get; set; }
   [NotMapped]
   public int? B {
      get {
         return FooB == null ? null : FooB.B;
      }
      set {
         if(value == null) {
            FooB = null;
         } else {
            if(FooB == null)
               FooB = new FooB();
            FooB.B = (int)value;
         }
   public virtual FooB FooB{ get; set; }
}

そしてデータベースクラスにマップされますFooB:

 class FooB {
    [Key, ForeignKey("FooId")]
    public int FooId { get; set; }
    public int B { get; set; }
 }

FooB余談ですが、基本的に単一のnull可能な列をテーブルに追加するのは非常に奇妙な方法のように思えます.null不可の列を複数持つことができる論理的な方法はなく、列の値を設定するとエンティティ全体が削除されることはありませんヌルに。

別のオプションは、必要に応じて動作するデータベース ビューを作成し、それをエンティティにマップすることです。

于 2014-04-20T17:14:47.593 に答える