将属性映射到Entity Framework CTP5中的(不同名称)外键字段

时间:2010-12-09 13:13:44

标签: entity-framework map foreign-keys fluent-interface entity-framework-ctp5

我正在尝试使用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;
    }
}

相应的表称为“商店”和“销售”。 Sales有一个StoreId外键,指向Stores表中的Id字段。

我正在努力将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");

然而,似乎这只适用于原始类型。

如何指定此映射?

3 个答案:

答案 0 :(得分: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");
    });

我的版本略有不同,因为我在关系的两边都有导航属性。

答案 1 :(得分:2)

我认为解决此问题的最佳方法是将独立协会升级为外键关联,这意味着不要隐藏外键{{1}实际上将它包含在ShopId类中。然后,您可以使用Data Aannotations / Fluent API更改其列名以匹配现有架构:

Sale


结果是所需的DB Schema: alt text

答案 2 :(得分:0)

我认为您正在寻找的是RelatedTo属性。有关详情,请参见this ADO.NET team blog post