我基于现有数据库创建了一个实体框架模型,然后从模型中生成了POCO实体。我的web.config中的连接字符串不是实体框架,它只是标准连接字符串(它缺少CSDL,SSDL,MSL引用)。
我可以编译我的应用程序,但是当我运行时,我收到此错误:
使用数据库优先和模型的T4模板生成的代码 如果在Code First模式下使用,则第一次开发可能无法正常工作。 要继续使用Database First或Model First,请确保实体 框架连接字符串在配置文件中指定 执行申请。要使用这些类,请从中生成 数据库优先或模型优先,使用代码优先添加任何其他 然后使用属性或DbModelBuilder API进行配置 删除抛出此异常的代码
我的问题是,在我的代码中,它实现了POCO来自自动生成,我怎样才能让它像Code First一样?我不想在我的连接字符串中引用CSDL等。
答案 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="data source=<your source>;initial catalog=<your db>;persist security info=True;user id=<your user id>;password=<your password>;multipleactiveresultsets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
答案 2 :(得分:0)
我首先使用数据库并通过将EDMX生成的连接字符串复制到我的启动应用程序的app.config来解决此问题。一个已经存在,但显然他们是不同的