Code First与Database First

时间:2011-12-23 16:27:53

标签: c# entity-framework entity-framework-4.1 code-first database-first

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

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

  

使用数据库优先和模型的T4模板生成的代码   如果在Code First模式下使用,则第一次开发可能无法正常工作。   要继续使用Database First或Model First,请确保实体   框架连接字符串在配置文件中指定   执行申请。要使用这些类,请从中生成   数据库优先或模型优先,使用代码优先添加任何其他   然后使用属性或DbModelBuilder API进行配置   删除抛出此异常的代码


我的问题是,在我的代码中,它实现了POCO来自自动生成,我怎样才能让它像Code First一样?我不想在我的连接字符串中引用CSDL等。

3 个答案:

答案 0 :(得分:23)

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

希望这有帮助。

答案 1 :(得分: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>

答案 2 :(得分:0)

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