2011-05-19 111 views
30

我在尝试将EF 4.1代码优先模型映射到数据库时遇到问题。当数据库完全匹配代码时,一切正常,但当我尝试和映射列名称不同时,然后我遇到问题。在实体框架代码中映射列首先

我在跟着一个必须用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 

我收到此错误:

The properties expression 'c => new <>f__AnonymousType0`5(colID = c.DinnerID, colTitle = c.Title, colHost = c.HostedBy, colDate = c.EventDate, colAddress = c.Address)' is not valid. The expression should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' VB.Net: 'Function(t) New From { t.MyProperty1, t.MyProperty2 }'.

什么是正确的语法来图列?如果

的积分你让我知道如何将地址属性映射到一个子类,称为地址:

public class Address 
{ 
    City 
    State 
    Zip, etc 
} 

回答

44

我相信你只需要做

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

您的所有列的那您希望数据库列名称的名称与它们的属性名称不同。


编辑:一些更多的搜索后,我碰到this question。从这个以及你发布的错误来看,mc.Properties()更像是将值拆分成不同的表格,而不是实际重命名这些表格名称。我认为重命名仍然需要手动完成。

这又是谷歌搜索的信息,我不知道如果我只是错过了一块做你想要的东西:)。

+0

从教程,我下面就好像你可以一次全部映射多个列的完整列表,与样品。他们是否在最终版本中删除了这个功能? – Dismissile 2011-05-19 16:59:02

+0

老实说,不确定,因为我还没有尝试重命名列。这是我亲眼看到的唯一方式,但我没有看到很多。然而,重新阅读你的问题中的代码,尝试从'.Map()'调用中取出'.ToTable()'调用并将它添加到Map的末尾(所以'.Map(mc => ..) ..)。ToTable()')。我不知道这在API中是否有效,但我不知道给映射的两个命令是否有效。 – KallDrexx 2011-05-19 17:10:07

+0

尝试过之前的其他方式:) – Dismissile 2011-05-19 17:13:51

38

如何使用DataAnnotations?

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

你可以找到http://msdn.microsoft.com/en-us/data/gg193958

+4

它的作品,但我宁愿不包括在POCO类中。 – Dismissile 2011-05-19 18:14:12

+6

我认为它对您的POCO课程没有任何不良影响。另外,我不认为这是以任何方式反对关注的分离或打破任何设计模式。你可以很容易地做你的验证,在我看来,这是非常合理的。但这只是我的想法... – Kamyar 2011-05-19 18:26:19

+12

我不同意。您的POCO类不应该有任何有关数据库模式的知识,即使它只是通过属性的元数据。 – Dismissile 2011-05-19 20:58:20

相关问题