我刚刚从 EF 4.0.0 升级到 EF 4.3.1。我在更新到最新版本的 Windows XP 上使用 Visual Studio 2010 Ultimate,并应用了所有 Windows 更新/补丁。我使用的数据库引擎是 SQL Server 2008 R2 Developers Edition。以下代码在 EF 4.0.0 下完美运行,但在 EF 4.3.1 下无法正常运行。
public class ItemBase
{
public DateTime Created { get; set; }
public int CreatedByUserID { get; set; }
public DateTime LastModified { get; set; }
public int LastModifiedByUserID { get; set; }
public User CreatedBy { get; set; }
public User LastModifiedBy { get; set; }
public ItemBase()
{
CreatedByUserID = -1;
LastModifiedByUserID = -1;
CreatedBy = null;
LastModifiedBy = null;
}
}
public class User : ItemBase
{
public int UserID { get; set; }
public string LoginName { get; set; }
public string Password { get; set; }
public string EmailAddress { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public string DisplayName { get; set; }
public User() : base()
{
UserID = -1;
LoginName = String.Empty;
Password = String.Empty;
EmailAddress = String.Empty;
Firstname = String.Empty;
Lastname = String.Empty;
DisplayName = String.Empty;
}
}
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().Property(u => u.UserID).HasDatabaseGenerationOption(DatabaseGenerationOption.Identity);
}
唯一改变的是我正在使用的实体框架的版本。我已经检查了参考资料等,一切都符合预期。
从上面的代码可以看出,User 类继承自 ItemBase,而 ItemBase 又引用了一个 User 实例。底层 User 表包含来自 User 类和 ItemBase 类的所有属性(除了两个导航属性 public User CreatedBy { get; set; } 和 public User LastModifiedBy { get; set; })在 4.0.0 下运行此代码一切都按预期工作,没有任何问题或问题。
但是,当我在 4.3.1 下运行相同的代码(没有对其他任何内容进行任何更改,包括我正在使用的数据库)时,我收到以下错误:
“无法确定“用户”和“用户”类型之间关联的主体端。必须使用关系流式 API 或数据注释显式配置此关联的主体端。 “
因此,我在 OnModelCreating 方法中添加了以下两行:
modelBuilder.Entity<User>().HasRequired(u => u.CreatedBy).WithMany().HasForeignKey(k => k.CreatedByUserID);
modelBuilder.Entity<User>().HasRequired(u => u.LastModifiedBy).WithMany().HasForeignKey(k => k.LastModifiedByUserID);
然后我得到这些奇怪的错误:
"提供者没有返回 ProviderManifestToken 字符串。 "
"建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。未找到服务器或无法访问服务器。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者: SQL 网络接口,错误:26 - 错误定位服务器/指定的实例) “
我还注意到在输出窗口中加载和加载这些错误:“ System.Data.dll 中发生了‘System.Data.SqlClient.SqlException’类型的第一次机会异常”
但是,这些错误似乎有点牵强,因为数据库很好,可用,并且连接字符串也很完美。如果我随后撤消对 OnModelCreating 方法的更改,我会再次收到原始错误,因此我不相信我收到的错误消息实际上反映了这里发生的潜在问题。
因此,基于所有这些,我得出以下结论:
- Entity Framework 4.3.1 版本有bug?
- 我的代码在 4.0.0 下工作而在 OnModelCreating 方法中没有额外两行的事实可能是由于在 4.0.0 中没有进行检查,而现在在 4.3.1 中进行了检查?
- 我需要在我的配置/代码中添加一些额外的东西,或者我缺少其他东西来使这项工作在 4.3.1 下再次工作?
任何人都可以为我阐明这一点吗?它让我发疯!非常感谢您在这方面的时间。亲切的问候史蒂夫