Code First和Database First的区别

21

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

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

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


我的问题是,我的代码中的哪个部分意识到POCO是自动生成的,我如何使其表现得像Code First?我不想在连接字符串中引用CSDL等。


很遗憾,你需要同时使用模型优先和代码优先... - Serdar
2
@Serdar - 不一定。他可能想要从已知模型生成代码开始,但从那时起开始使用Code First编写新代码。 - Brian Rogers
@BrianRogers,现在是2018年,您的回答为我节省了时间,并且避免了在StackOverflow上提问。 - fedeteka
3个回答

24
如果连接字符串中包含元数据,EF会认为这是模型优先或数据库优先。如果它是一个普通的连接字符串,EF会认为这是代码优先。但是,如果你想从模型优先开始,但让EF认为你真正在做的是代码优先(这才是你所做的),请确保你使用的是DbContext代码生成器,而不是默认的代码生成器。代码优先POCOs就是那些“普通的C#对象”,它们并没有特殊的数据库感知或更改跟踪功能。要使用DbContext代码生成器,请右键单击您的模型图,并选择“添加新代码生成项...”,然后选择ADO.NET DbContext生成器。此外,根据你如何命名你的主键和外键以及它们是否比简单的整数ID更复杂,你可能需要填写一些代码来映射你的对象之间的关系,在你的上下文中“OnModelCreating”方法中删除throw new UnintendedCodeFirstException();行,用你的映射代码替换它。否则,EF可能无法确定所有关系(记住,没有元数据可以依赖)。希望这能帮到你。

你的回复帮了我很多。我在我的问题/回复中加入了你的参考链接 @ http://stackoverflow.com/questions/18674079/ef-5-0-database-first-model-not-working-on-one-table/18675388#18675388。谢谢。 - HGMamaci

13
你的配置文件需要包含以下内容:
<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>

你好John,非常感谢。你的答案对我很有效。 - Ashok kumar
如果您正在将connectionString从(localdb)数据源切换到SQL数据源,请使用此解决方案。也就是说,如果您现在为数据源提供了实际的服务器名称,则此解决方案是正确的选择。 - Marquis Blount

1

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


这实际上也是我的问题的答案。我试图用Database First元素替换我在工作中继承的软件的Code First元素,因为这样使用存储过程更加友好。由于数据库位置没有改变,我尝试重用现有的连接字符串。然而,从其他地方获取一个可用的Database First版本的连接字符串,并将其用于当前项目的配置文件中解决了这个问题。 - MeanJerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接