在我们的项目中,我们有必要向数据库添加一些预定义的数据。我认为最好的方法和概念是用于EF迁移(不是种子方法)。
但是在向数据库添加相关数据方面存在很大的麻烦:
例如:
假设我们有2个表:
使用者:
角色:
假设我们需要添加User(Name ='John',RoleId =(名称为'Admin'的角色的ID))。
我们该怎么做?如果找到能够允许我们执行不使用代码优先实体的纯SQL SELECT脚本的解决方案,那就太好了,因为它们可以被修改或删除。
对于DELETE,INSERT,UPDATE,可以使用 Sql (...)方法,但是 SELECT 又如何呢?
最佳答案
您不能将上下文包含在迁移中。
从逻辑上讲,首先运行迁移以更新数据库模式,然后可以通过它使用上下文来处理数据。如果您的数据库与模型不匹配,或者甚至表仍然不存在,则无法在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')).
对于我的问题,我不得不做一些更复杂的执行-以下操作与使用IF语句的DbSet的AddOrUpdate方法相同:
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/