4

假设我有一个名为 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 发现一个无法推断主键的类,并且没有通过 Data Annotations 或 fluent API 注册主键, 则该类型将自动注册为复杂类型。复杂类型检测还要求该类型不具有引用实体类型的属性(即所有属性必须是标量类型)并且不从另一个类型上的集合属性引用。” 我的 Address 类符合这些标准:它由字符串组成,不在其他任何地方使用。

但是,在应用程序中(我不确定这是否有任何区别),我们将用户称为其他东西 - 例如,Techs。我想将用户的地址列分解为一个地址,以便每个技术人员都可以拥有自己的地址。根据上面的文章,EF 应该自动推断并处理复杂类型。但是,当上下文试图给我一个技术时,我得到的是以下例外:

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”)。

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

4

1 回答 1

5

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

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

或通过流畅的 API:

modelBuilder.ComplexType<Address>().Property(a => a.City).HasColumnName("City");
于 2012-04-05T14:36:18.063 回答