我有一个.NET 4.5 WPF应用程序,可以通过Entity Framework 6.2直接访问MS SQL数据库。该应用程序在我们客户的大多数计算机上运行得非常好,但是有一个系统我们的应用程序无法访问数据库,因为EF在内部创建了引用不存在的表的SQL语句:
System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常---> System.Data.SqlClient.SqlException:无效的对象名称'dbo.Configurations'。
我们的配置实体如下所示:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SomeNamespace
{
[Table("Configuration")]
public class Configuration : EntityBase
{
[Required]
[MaxLength(50)]
public string Name { get; set; }
public string Value { get; set; }
[Required]
public string Username { get; set; }
}
}
我们的DbContext类看起来像这样(摘录):
public class SomeContext : DbContext
{
public virtual DbSet<Configuration> Configurations { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<SomeContext>(null);
base.OnModelCreating(modelBuilder);
}
}
为什么某些系统上的EF会忽略TableAttribute
?对我来说,显然EF在这种情况下不尊重TableAttribute
,因为它想要访问dbo.Configurations
表(使用DbContext的Configurations属性派生)而不是dbo.Configuration
使用属性中的名称。 有趣的是,这只发生在一台计算机上 - 在所有其他计算机上,应用程序运行良好。
我怀疑在GAC中安装了旧版本的EF而不是我在我们的应用程序中部署的EF DLL - 因此我在项目参考中将特定版本设置为true(实体框架未通过NuGet添加到项目中。这并没有解决问题。
我认为快速解决方案是不使用属性,而是使用流畅的API。但是,有人知道为什么会出现这个问题吗?
提前感谢您的帮助!