c# - Entity Framework (4.3) 寻找单数名称而不是复数名称(当实体名称以 "s"结尾时)

标签 c# .net entity-framework entity-framework-4 entity-framework-4.3

这是我的情况: 我已经在 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=&quot;data source=.\sqlexpress;initial catalog=MyEntities;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;"
    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/

相关文章:

c# - 使用 FileStream 和这些选项 c# 读取文本文件的实际内容

c# - SOLID 原则以及如何实际实现它们

asp.net - 是创建一个标签并从代码隐藏更新其文本更好,还是创建多个标签并根据需要显示/隐藏标签更好?

c# - 如何通过主键和外键(右连接)合并两个数据表?

.net - 如何为 Entity Framework 创建的 SQL 语句获得更好的表别名?

c# - 如何处理 Entity Framework 中的陈旧缓存?

c# - Entity Framework .Where 方法链接

c# - 获取机器 SID(包括主域 Controller )

c# - 将元素的多个属性返回到列表。 LINQ 到 XML

c# - 读取非英文文件