20

我基于现有数据库创建了一个实体框架模型,然后从该模型生成 POCO 实体。我的 web.config 中的连接字符串不是实体框架,它只是标准连接字符串(它缺少 CSDL、SSDL、MSL 引用)。

我可以编译我的应用程序,但是当我运行时出现此错误:

如果在 Code First 模式下使用,使用用于 Database First 和 Model First 开发的 T4 模板生成的代码可能无法正常工作。要继续使用 Database First 或 Model First,请确保在执行应用程序的配置文件中指定了实体框架连接字符串。要使用从 Database First 或 Model First 生成的这些类,使用 Code First 添加使用属性或 DbModelBuilder API 的任何其他配置,然后删除引发此异常的代码


我的问题是,它在我的代码中哪里意识到 POCO 来自自动生成,我怎样才能让它表现得像 Code First?我不想在我的连接字符串中引用 CSDL 等。

4

3 回答 3

23

如果连接字符串有元数据,EF 认为它是模型优先或数据库优先。如果它是一个普通的连接字符串,EF 认为它是 Code First。但是,如果您想先做模型,但让 EF 认为您实际上是先做代码(这就是您正在做的事情),请确保您使用的是 DbContext 代码生成器,而不是默认的代码生成器。代码优先 POCO 真的是——“普通的旧 c# 对象”——根本没有特殊的数据库感知或更改跟踪内容。要使用 DbContext 代码生成器,请右键单击您的模型图并选择“添加新代码生成项...”,然后选择 ADO.NET DbContext 生成器。此外,取决于您如何命名主键和外键和/或它们是否比简单的 int ID 更复杂,您可能需要填写一些代码来映射上下文中“OnModelCreating”方法中的对象之间的关系。删除行throw new UnintendedCodeFirstException();并将其替换为您的映射代码。否则 EF 可能无法找出所有关系(请记住,它没有可依赖的元数据)。

希望这可以帮助。

于 2011-12-23T16:59:14.787 回答
12

您的配置文件中需要以下内容:

<connectionStrings>
<add name="<The name of your class>" 
     connectionString="metadata=res://*/<test>.csdl|res://*/<test>.ssdl|res://*/<test>.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=<your source>;initial catalog=<your db>;persist security info=True;user id=<your user id>;password=<your password>;multipleactiveresultsets=True;App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient" />
</connectionStrings>
于 2012-08-16T13:19:39.090 回答
0

我首先使用数据库并通过将 EDMX 生成的连接字符串复制到我的启动应用程序的 app.config 来解决这个问题。一个已经存在,但显然它们是不同的

于 2015-05-04T15:32:46.713 回答