EF 代码优先模式生成问题

Posted

技术标签:

【中文标题】EF 代码优先模式生成问题【英文标题】:EF code first schema generation problem 【发布时间】:2011-05-13 10:39:19 【问题描述】:

为什么要进行这种映射(在 SQL CE 4.0 上)

ToTable("USERS");
      HasKey(c => c.Id);
      Property(c => c.Id).HasColumnName("USERS_ID");
      Property(c => c.ActiveDirectoryUsername).HasColumnName("AD_ID");
      Property(c => c.LastUpdated).HasColumnName("LastUpdated").IsOptional();
      Property(c => c.Active).HasColumnName("Active").IsOptional();
      Property(c => c.AccountType).HasColumnName("AccountType").IsOptional();
      HasOptional(c => c.Contact).WithMany().Map(c => c.MapKey("CONTACT_ID"));
      Map<UserCompanyLink>(m => m.Requires("IsCompanyDelegate").HasValue(1));
      Map<UserDirectorLink>(m => m.Requires("IsCompanyDelegate").HasValue(0));

产生这个错误

SetUp : System.InvalidOperationException : The database creation succeeded, but the creation of the database objects did not. See inner exception for more details.
  ----> System.Data.SqlServerCe.SqlCeException : A column ID occurred more than once in the specification.

我希望能够看到正在生成的架构 sql 来调试它...

编辑

将 IsCompanyDelegate 添加到 UserLink 基本实体后,我现在得到

SetUp : System.Data.DataException : An exception occurred while initializing the database. See the InnerException for details.
  ----> System.Data.EntityCommandCompilationException : An error occurred while preparing the command definition. See the inner exception for details.
  ----> System.Data.MappingException : 
(69,10) : error 3023: Problem in mapping fragments starting at lines 69, 79, 88, 172:Column UserLink.IsCompanyDelegate has no default value and is not nullable. A column value is required to store entity data.
An Entity with Key (PK) will not round-trip when:
  ((PK is NOT in 'UserLinks' EntitySet OR Entity is type [eServices.Admin.Data.Contexts.UserLink]) AND (PK is in 'UserLinks' EntitySet OR PK plays Role 'UserLink_Contact_Source' in AssociationSet 'UserLink_Contact'))

完全神秘的gobbledygook。

为什么映射 TPH 如此复杂。代码的重点首先是能够创建您认为合适的模型?

编辑

所以它看起来没有数据库存在,我们得到第一个错误(即第一次测试运行),所以第二个错误可能是不相关的。

【问题讨论】:

【参考方案1】:

原来这是一个随机错误,与此特定关系无关。

我将连接从 SQL Server CE 更改为 SQL Server 2008,并且收到了更有用的错误消息。这次它告诉我哪个列 ID 和在哪个表上。

故事的寓意,如果你使用 SQL Server CE,试试它的大哥,你可能会有更多的运气。

【讨论】:

以上是关于EF 代码优先模式生成问题的主要内容,如果未能解决你的问题,请参考以下文章

EF的三种模式

代码优先的 EF 数据库在启动时不会自动生成

EF 4.1 代码优先:多对多

csharp EF代码优先修改生成的数据库与模型一样

EF6(代码优先)单个外键属性上的多个导航属性

使用 EF4 CTP4 代码优先方法生成的多对多表中的命名约定