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

Rob*_*obC 4 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发现一个无法推断出主键的类,并且没有通过Data Annotations或Fluent 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'.
Run Code Online (Sandbox Code Playgroud)

看起来它试图理解Tech.Address属性,但是给它的每个子属性提供了错误的名称(例如,"Address_City"而不是"City").

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

Lad*_*nka 5

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

public class Address
{
    [Column("City")]
    public string City { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

或通过流畅的API:

modelBuilder.ComplexType<Address>().Property(a => a.City).HasColumnName("City");
Run Code Online (Sandbox Code Playgroud)