实体框架创建列名比预期长的数据库

Posted

技术标签:

【中文标题】实体框架创建列名比预期长的数据库【英文标题】:Entity Framework creating database with longer column names than expected 【发布时间】:2012-11-26 19:04:14 【问题描述】:

我已经创建了一个模型

public class Moo

    public Int32 MooId  get; set; 
    public string Description  get; set; 
    public City CityIdFrom  get; set; 
    public Int32 Weight  get; set; 

public class City

    public Int32 CityId  get; set; 
    public string Name  get; set; 

我写了

public class MvcApplication : System.Web.HttpApplication

    protected void Application_Start()
    
        System.Data.Entity.Database.SetInitializer(
             new System.Data.Entity.DropCreateDatabaseAlways<DbConnection>());
        ...

在 Global.asax.cs 中

简而言之 - 我按照 here 中的教程进行操作。

但是,我得到了一个数据库表 Moo,其列如下:

   [MooId]
  ,[Description]
  ,[Weight]
  ,[CityIdFrom_CityId]

但是,就像在教程中一样,我希望它看起来像:

   [MooId]
  ,[Description]
  ,[Weight]
  ,[CityIdFrom]

生成器添加不必要的_CityId的原因是什么? (对于所有具有关系的表的列也是如此)我很确定必须有一个设置,但我发现我的问题很难用语言表达。

【问题讨论】:

【参考方案1】:

您没有在 Moo 模型中明确声明 FK 列。

CityIdFrom 属性是 City 类型的导航属性,而不是 Int32 类型的 FK 列。

因此,您在数据库中看到的列是由 EF 自动为您创建的。

如果要命名此列,则必须将其添加到模型中:

public class Moo

  public Int32 MooId  get; set; 
  public string Description  get; set; 

  public Int32 CityFromId  get; set; 
  public City CityFrom  get; set; 

  public Int32 Weight  get; set; 

注意:列名是约定俗成的,所以 EF 可以弄清楚什么是什么。 所以CityFromIdCityFrom 导航属性的数据库FK 列,因为它与末尾的Id 同名。

【讨论】:

【参考方案2】:

它正在为City.CityId 创建一个外键,因此额外的_CityId。您需要添加属性 [Column("CityIdFrom")] 以告诉框架您希望它使用自己默认以外的其他内容。

【讨论】:

我已经添加了System.ComponentModel.DataAnnotations.Schema.Column("Aaa")] public City CityIdFrom get; set; ,但它并没有改变任何东西:(我可能只是瞎了。我还在执行之前删除了表,所以我确信它会重新创建表。

以上是关于实体框架创建列名比预期长的数据库的主要内容,如果未能解决你的问题,请参考以下文章

实体框架核心:无效的列名“UserId1”

在实体框架.net核心中获取无效的列名“CompanyLocationId”

创建实体框架上下文的实例在负载下减慢

为啥 c 中的幂函数需要比预期更长的时间

实体框架 FirstOrDefault 谓词未返回预期结果

实体框架无效的列名