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

Dis*_*ile 36 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");
            }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望我的桌子是:

tblDinners  
    colID  
    colHost  
    colDate  
    colTitle  
    colAddress  
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

属性表达式'c => new <> f__AnonymousType0`5(colID = c.DinnerID,colTitle = c.Title,colHost = c.HostedBy,colDate = c.EventDate,colAddress = c.Address)'无效.表达式应该表示一个属性:C#:'t => t.MyProperty'VB.Net:'Punction(t)t.MyProperty'.当指定多个属性时,使用匿名类型:C#:'t => new {t.MyProperty1,t.MyProperty2}'VB.Net:'Function(t)New From {t.MyProperty1,t.MyProperty2}'.

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

如果您让我知道如何将Address属性映射到名为Address的子类,则可以获得奖励积分:

public class Address
{
     City
     State
     Zip, etc
}
Run Code Online (Sandbox Code Playgroud)

Kal*_*exx 52

我相信你只需要做

modelBuilder.Entity<Dinner>().Property(x => x.HostedBy).HasColumnName("colHost");
Run Code Online (Sandbox Code Playgroud)

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


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

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


Kam*_*yar 44

如何使用DataAnnotations?

[Key]
[Column("ColID", TypeName="int")]
public int DinnerID { get; set; }  
Run Code Online (Sandbox Code Playgroud)

您可以在http://msdn.microsoft.com/en-us/data/gg193958找到包含样本的完整列表

  • 我不同意.您的POCO类不必具有关于数据库模式的任何知识,即使它只是通过属性的元数据. (13认同)
  • 我认为它对你的POCO课程没有任何不良影响.此外,我认为这不是以任何方式分离关注或打破任何设计模式.您可以非常轻松地进行验证,在我看来,这是非常合理的.但那只是我的想法...... (8认同)
  • 它有效,但我宁愿不在POCO课程中包含它. (4认同)
  • 取决于您的要求.这不是绝对的*RULE*.如果您计划支持多个数据库,那么您是对的(目前为止.直到EF Code-First支持其他RDBMS.)否则,它会有效地缩短您的开发时间. (2认同)
  • 如果您正在使用属性,那么您做错了.期. (2认同)