gpt4 book ai didi

entity-framework-4.1 - EntityFramework 4.1 Code First 错误地命名了复杂类型的列名

转载 作者:行者123 更新时间:2023-12-05 01:29:57 26 4
gpt4 key购买 nike

假设我有一个名为 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 应该推断出这一点并自动处理复杂类型。但是,当上下文试图给我一个技术时,我得到的是以下异常(exception):

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

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

最佳答案

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

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

或通过流畅的 API:
modelBuilder.ComplexType<Address>().Property(a => a.City).HasColumnName("City");

关于entity-framework-4.1 - EntityFramework 4.1 Code First 错误地命名了复杂类型的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10030390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com