这是我的情况: 我已经在 ASP.NET MVC 3 应用程序上工作了一段时间。它有一个数据库(由 db 项目构建;我先使用 db),我有一个 edmx 模型,然后是一组 POCO。我的实体在数据库中有复数名称,而 POCO 有单数名称。一切都很好地映射,没有问题。
或者在我添加新表(称为 TransactionStatuses)之前一直如此。现在,所有旧实体仍然有效,但新实体却不起作用。当我尝试将它与相关实体一起加载时:
var transactions = (from t in db.Transactions.Include(s => s.TransactionStatus) //TransactionStatus - navigation property in Transactions to TransactionStatuses
where t.CustomerID == CustomerID
select t).ToList();
我明白了
Invalid object name 'dbo.TransactionStatus'.
我什至做了一个更简单的测试:
List<TransactionStatus> statuses = db.TransactionStatuses.ToList();
= 相同的结果。
我已经从数据库更新(甚至重新创建)edmx 并反复检查它,试图找出 dbo.TransactionStatus*es* 的映射有何不同把整个事情搞砸了。
如果有人能指出我修复的方向,那就太好了。
附言关闭多元化不是一个选项,谢谢。
更新:我想通了 - 我的回答如下。
最佳答案
这可能会发生,因为尽管本意是使用数据库优先流程,但实际上应用程序正在使用代码优先进行映射。让我多解释一下,因为这可能会造成混淆。 :-)
在 Visual Studio 中将 Database First 与 EF Designer 和 DbContext 模板结合使用时,会发生三件非常重要的事情。首先,新的实体数据模型向导向您的应用程序添加一个连接字符串,其中包含数据库优先模型(即 EDMX)的详细信息,以便在应用程序运行时可以找到该模型。连接字符串看起来像这样:
<connectionStrings>
<add name="MyEntities"
connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.\sqlexpress;initial catalog=MyEntities;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
其次,生成的上下文类调用指定此连接字符串名称的基本 DbContext 构造函数:
public MyEntities()
: base("name=MyEntities")
{
}
这会告诉 DbContext 在配置中查找并使用“MyEntities”连接字符串。使用“name=”意味着 DbContext 在找不到连接字符串时会抛出异常——它不会继续按照约定创建连接。
如果要使用数据库优先,则必须使用与生成的连接字符串类似的连接字符串。具体来说,它必须包含模型数据(来自 EDMX 的 csdl、msl、ssdl)并且您必须确保 DbContext 找到它。更改对基本构造函数的调用时要非常小心。
发生的第三件事是 OnModelCreating 在生成的上下文中被覆盖并抛出:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
这样做是因为只有在使用 Code First 时才会调用 OnModelCreating。这是因为 OnModelCreating 完全是关于创建模型的,但是当您使用 Database First 时,模型已经存在——在运行时不需要创建任何东西。因此,如果调用了 OnModelCreating,则可能是因为您无意中开始使用 Code First,通常是因为更改了连接字符串或调用了基本构造函数。
现在,您可能想要使用 Code First 映射到现有数据库。这是一个很好的模式并得到完全支持(请参阅 http://blogs.msdn.com/b/adonet/archive/2011/03/07/when-is-code-first-not-code-first.aspx ),但您需要确保正确设置映射才能使其正常工作。如果映射设置不正确,那么您将遇到类似本问题中的异常。
关于c# - Entity Framework (4.3) 寻找单数名称而不是复数名称(当实体名称以 "s"结尾时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9441892/