实体框架创建列名比预期长的数据库
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 可以弄清楚什么是什么。
所以CityFromId
是CityFrom
导航属性的数据库FK 列,因为它与末尾的Id
同名。
【讨论】:
【参考方案2】:它正在为City.CityId
创建一个外键,因此额外的_CityId
。您需要添加属性 [Column("CityIdFrom")]
以告诉框架您希望它使用自己默认以外的其他内容。
【讨论】:
我已经添加了System.ComponentModel.DataAnnotations.Schema.Column("Aaa")] public City CityIdFrom get; set;
,但它并没有改变任何东西:(我可能只是瞎了。我还在执行之前删除了表,所以我确信它会重新创建表。以上是关于实体框架创建列名比预期长的数据库的主要内容,如果未能解决你的问题,请参考以下文章