3

Entity Framework CTP5 Fluent API を使用して既存のデータベースをマップしようとしています。私は次のクラスを持っています:

public class Shop
{
    public long Id
    {
        get;
        set;
    }
}

public class Sale
{
    public long Id
    {
        get;
        set;
    }

    public virtual Shop Shop
    {
        get;
        set;
    }
}

対応するテーブルは、"Stores" および "Sales" と呼ばれます。Sales には、Stores テーブルの Id フィールドを指す StoreId 外部キーがあります。

Sale.Shop.Id をテーブルの StoreId にマップするのに苦労しています。それを ShopId に変更する自由はないので、マップする必要があります。

CTP4 では、以下を使用していました。

modelBuilder.Entity<Sale>().MapSingleType(x =>
    new
    {
        Id = x.Id,
        StoreId = x.Shop.Id
    });

私は次のことを試しました:

modelBuilder.Entity<Sale>().Property(x => x.Shop.Id).HasColumnName("StoreId");

ただし、これはプリミティブ型でのみ機能するようです。

このマッピングを指定するにはどうすればよいですか?

4

3 に答える 3

9

更新: EF 4.1 のリリース候補版の改訂版を以下に追加しました。

いくつかの狩りの後、私は自分に合った答えを見つけました:

EF4.1 RC バージョン:

modelBuilder.Entity<Booking>().HasRequired(b => b.Booker)
    .WithMany(m => m.BookedSlots).Map(p=>{
                    p.MapKey("BookerID");
    });

あなたの場合:

modelBuilder.Entity<Sale>().HasRequired(sale => sale.Shop)
    .WithMany().Map(s=> {
           s.MapKey("StoreId");
    });

関係の両側にナビゲーション プロパティがあるため、私のバージョンは少し異なります。

于 2010-12-10T21:18:51.343 に答える
2

これを解決する最善の方法は、独立した関連付けを 外部キー関連付けにアップグレードすることです。つまり、外部キーを非表示にするのではなくShopId、実際にSaleクラスに含めることです。次に、Data Aannotations/Fluent API を使用して、既存のスキーマに一致するように列名を変更できます。

public class Shop
{
    public long Id { get;set; }
}

public class Sale
{
    public long Id { get; set; }

    [Column(Name="StoreID")]
    public long ShopId { get; set; }

    public virtual Shop Shop { get; set; }
}


目的の DB スキーマの結果: 代替テキスト

于 2010-12-09T15:03:27.480 に答える
0

あなたが探しているのはRelatedTo属性だと思います。詳細については、この ADO.NET チームのブログ投稿を参照してください。

于 2010-12-09T14:34:33.320 に答える