gpt4 book ai didi

entity-framework - EF 6 迁移 : How to execute sql SELECT?

转载 作者:行者123 更新时间:2023-12-03 07:41:04 26 4
gpt4 key购买 nike

在我们的项目中,我们需要向数据库添加一些预定义的数据。我认为最好的方法和概念是使用 EF 迁移(而不是种子方法)。

但是我们在向数据库添加相关数据时遇到了很大的麻烦:

例如:

假设我们有 2 个表:

用户:

  • Id(PK 自动递增)
  • 姓名
  • 角色 ID

角色:

  • Id(PK 自动递增)
  • 姓名

假设我们需要添加 User(Name = 'John', RoleId = (名称为 'Admin' 的角色的 ID))。

我们怎样才能做到呢?如果我们找到一个解决方案,允许我们执行纯 SQL SELECT 脚本,该脚本不使用 Code First 实体,那就太好了,因为它们可以修改或删除。

对于DELETEINSERTUPDATE可以使用Sql(...)方法,但是呢选择

最佳答案

您无法为迁移提供上下文。

从逻辑上讲,首先运行迁移以更新数据库架构,然后您可以拥有一个通过它处理数据的上下文。如果你的DB与模型不匹配,甚至表还没有,那么你就无法在EF中使用它。

我必须研究 EF 代码(也是因为很好奇)。实际上,下面几个级别的 DbMigration 类中的 Sql() 方法只是将 SQL 字符串添加到应在事务中执行的查询列表中,然后继续。当它被调用时它不会执行它。简而言之,EF 只是填写了一个应该立即执行的代码行列表。如果您尝试遍历迁移代码中 C# 代码可以执行的所有操作,这似乎是正确的。

这个问题实际上很好,不幸的是我仍然没有找到比使用纯ADO更好的解决方案。

另一个选择是生成更多自定义 SQL 查询,并更广泛地使用 T-SQL。对于您的情况,当您想要插入用户并设置按名称查找的 groupId 时,它可以与内部选择一起使用:

INSERT INTO Users (Name, GroupId)
VALUES ('John', RoleId = (SELECT Id FROM Roles WHERE Name = 'Admin')).

对于我的问题,我必须做一些更复杂的执行 - 以下与 DbSet 的 AddOrUpdate 方法相同,使用 IF 语句:

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
INSERT INTO Table1 VALUES (...)

我在这里找到它:http://blogs.msdn.com/b/miah/archive/2008/02/17/sql-if-exists-update-else-insert.aspx

关于entity-framework - EF 6 迁移 : How to execute sql SELECT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21799345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com