【问题标题】:Code First vs. Database First代码优先与数据库优先
【发布时间】:2023-03-11 06:54:01
【问题描述】:

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

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

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


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

【问题讨论】:

  • 你需要先使用模型和代码,这很糟糕......
  • @Serdar - 不一定。他可能想从一个已知模型开始生成代码,然后从那时开始首先使用代码来编写新代码。
  • @BrianRogers 现在在 2018 年,您的回答可以节省我的时间并在 StackOverflow 上提出问题

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


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

【解决方案2】:

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

<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>

【讨论】:

  • 嗨,约翰,非常感谢。你的回答对我很有效。
  • 如果您要将 connectionString 从 (localdb) 数据源切换到 SQL 数据源,请使用此解决方案。即,如果您现在为数据源提供实际的服务器名称,则此解决方案是可行的方法。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2017-01-14
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多