首先在实体框架代码中映射列

时间:2011-05-19 16:45:39

标签: c# entity-framework ef-code-first

我在尝试将EF 4.1 Code First模型映射到数据库时遇到问题。当数据库完全匹配代码时,一切正常,但当我尝试映射列名称不同时,我遇到了问题。

我正在关注一个必须使用其中一个CTP构建的教程,因为有些方法缺失/不同。

我的模型看起来像:

public class Dinner
{
    public int DinnerID { get; set; }  
    public string HostedBy { get; set; }
    public DateTime EventDate { get; set; }
    public string Title { get; set; }
    public string Address { get; set; }
}

public class NerdDinners : DbContext
{
    public DbSet<Dinner> Dinners { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // THIS IS WHAT I TRIED BUT IT IS FAILING
        modelBuilder.Entity<Dinner>().Map(mc =>
            {
                mc.Properties(c => new {
                    colID = c.DinnerID,
                    colTitle = c.Title,
                    colHost = c.HostedBy,
                    colDate = c.EventDate,
                    colAddress = c.Address
                });
                mc.ToTable("tblDinner");
            }
        );
    }
}

我希望我的桌子是:

tblDinners  
    colID  
    colHost  
    colDate  
    colTitle  
    colAddress  

我收到此错误:

  

属性表达式'c =&gt;新   &lt;&gt; f__AnonymousType0`5(colID =   c.DinnerID,colTitle = c.Title,   colHost = c.HostedBy,colDate =   c.EventDate,colAddress = c.Address)'   无效。表达应该   代表一个属性:C#:'t =&gt;   t.MyProperty'VB.Net:'功能(t)   t.MyProperty”。指定时   多个属性使用匿名   类型:C#:'t =&gt;新{t.MyProperty1,   t.MyProperty2}'VB.Net:'功能(t)   新来自{t.MyProperty1,   t.MyProperty2}'。

映射列的正确语法是什么?

奖励积分如果您让我知道如何将地址属性映射到名为地址的子类:

public class Address
{
     City
     State
     Zip, etc
}

2 个答案:

答案 0 :(得分:51)

我相信你只需做

modelBuilder.Entity<Dinner>().Property(x => x.HostedBy).HasColumnName("colHost");

对于您希望db列名称的名称与其属性名称不同的所有列。


修改:经过多次搜索后,我遇到了this question。从那个和你发布的错误来看,似乎mc.Properties()更多的是将值拆分到不同的表中,而不是实际重命名这些表名。我认为重命名仍然需要手动完成。

这又是来自谷歌搜索的信息,我不知道我是否只是错过了一件事来做你想要的:)。

答案 1 :(得分:42)

如何使用DataAnnotations?

[Key]
[Column("ColID", TypeName="int")]
public int DinnerID { get; set; }  

您可以在http://msdn.microsoft.com/en-us/data/gg193958

找到包含样本的完整列表