使用Entity Framework Code First映射列

45

我在尝试将我的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 => 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: 'Function(t) t.MyProperty'。当指定多个属性时,请使用匿名类型: C#: 't => new { t.MyProperty1, t.MyProperty2 }' VB.Net: 'Function(t) New From { t.MyProperty1, t.MyProperty2 }'。
如何正确映射列?
如果您想将 Address 属性映射到名为 Address 的子类中,则可以使用以下代码:
```csharp public class Dinner { // other properties public Address Address { get; set; } } public class Address { public string Street { get; set; } public string City { get; set; } public string State { get; set; } public string ZipCode { get; set; } } ```
public class Address
{
     City
     State
     Zip, etc
}
2个回答

58

4
可以,但我宁愿不在 POCO 类中包含这个。 - Dismissile
8
我认为它不会对你的POCO类产生任何负面影响。而且,我也不认为这与关注点分离有任何冲突或违反任何设计模式。你可以很容易地进行验证,我认为这非常合理。但这只是我的想法... - Kamyar
17
我不同意。你的POCO类不应该对数据库模式有任何了解,即使只是通过属性来获得元数据。 - Dismissile
2
取决于您的需求。这不是绝对的“规则”。如果您计划支持多个数据库,那么您是正确的(目前为止,直到EF Code-First支持其他RDBMSs)。否则,它可以有效地减少您的开发时间。 - Kamyar
1
一旦您开始添加属性,您就不再拥有POCO,这在Java中使用JPA注释时会遇到相同的困境。 - Michael Joyce
3
如果你正在使用属性,那么你做错了。没商量。 - Phill

57

我相信你只需要做

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

如果您想让数据库列名与属性名不同,可以使用以下代码来针对所有相关列进行重命名:


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

这些都是通过Google搜索得到的信息,我不知道我是否缺少了某些内容以完全满足您的要求:)


从我跟着的教程来看,好像你可以一次性映射多个列。他们在最终版本中移除了这个功能吗? - Dismissile
说实话,我不确定,因为我没有尝试过重命名列。这是我个人见过的唯一方法,但我没有仔细研究过。然而,重新阅读您问题中的代码后,请尝试将.ToTable()调用从.Map()调用中移除,并将其添加到Map的末尾(所以是.Map(mc => ....).ToTable())。我不知道在API中是否有效,但我确实想知道给映射两个命令是否有效。 - KallDrexx
之前已经尝试过另一种方式了 :) - Dismissile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接