EntityFramework 4.1 Code First错误地命名复杂类型列名

时间:2012-04-05 14:19:23

标签: entity-framework-4.1

假设我有一个名为Users的表,其中包含您的典型信息:Id,Name,Street,City - 与此处的示例非常相似:

http://weblogs.asp.net/manavi/archive/2010/12/11/entity-association-mapping-with-code-first-part-1-one-to-one-associations.aspx

除此之外,本文还指出:

“Code First有一个基于一组约定的复杂类型发现的概念。惯例是,如果Code First发现无法推断出主键的类,并且没有通过数据注释注册主键或如果是流畅的API,那么类型将自动注册为复杂类型。复杂类型检测还要求类型没有引用实体类型的属性(即所有属性必须是标量类型)并且不从集合属性引用在另一种类型。“我的地址类符合以下条件:它由字符串组成,不会在其他任何地方使用。

在应用程序中,虽然(我不确定这是否有任何区别),但我们正在给用户打电话 - 比如Techs。我想将用户的地址列分成一个地址,这样每个Tech都可以拥有自己的地址。根据上面的文章,EF应该推断出这一点并自动处理复杂类型。但是,当上下文试图给我一个Tech时,我得到的是以下例外:

System.Data.EntityCommandExecutionException: An error occurred while executing t
he command definition. See the inner exception for details. ---> System.Data.Sql
Client.SqlException: Invalid column name 'Address_Street'.
Invalid column name 'Address_City'.
Invalid column name 'Address_State'.
Invalid column name 'Address_Zip'.

看起来它试图理解Tech.Address属性,但是给它的每个子属性命名错误(例如,“Address_City”而不是“City”)。

关于如何纠正这个问题的任何想法?

1 个答案:

答案 0 :(得分:5)

这是正确的行为。默认约定始终为映射到类型名称的复杂类型的属性添加前缀。如果要使用不同的列名,则必须通过数据注释来映射它们:

public class Address
{
    [Column("City")]
    public string City { get; set; }
    ...
}

或通过流利的API:

modelBuilder.ComplexType<Address>().Property(a => a.City).HasColumnName("City");