Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 播种期间基于视图的播种表_C#_Sql_Entity Framework_Entity Framework 6_Dbcontext - Fatal编程技术网

C# 播种期间基于视图的播种表

C# 播种期间基于视图的播种表,c#,sql,entity-framework,entity-framework-6,dbcontext,C#,Sql,Entity Framework,Entity Framework 6,Dbcontext,我有一个棘手的问题,我真的不知道如何解决 我在迁移脚本中使用std EF 6(代码优先)种子设定,其中我为系统设定了大约20个带有静态元数据的表 然而,我也有一个观点,我希望的“内容”被植入到另一个表中(避免EF CF不允许外键访问视图,因此没有“真正的”关联) 因此,我想做以下工作: 带数据的种子表1 在此基础上创建视图 从视图中为表2添加数据种子 我的问题是种子设定是在上下文和事务中完成的。因此,我上面的“步骤2”将从一个空视图中进行播种,因为播种到表1中的数据是在一个单独的事务中完成的 由

我有一个棘手的问题,我真的不知道如何解决

我在迁移脚本中使用std EF 6(代码优先)种子设定,其中我为系统设定了大约20个带有静态元数据的表

然而,我也有一个观点,我希望的“内容”被植入到另一个表中(避免EF CF不允许外键访问视图,因此没有“真正的”关联)

因此,我想做以下工作:

  • 带数据的种子表1
  • 在此基础上创建视图
  • 从视图中为表2添加数据种子
  • 我的问题是种子设定是在上下文和事务中完成的。因此,我上面的“步骤2”将从一个空视图中进行播种,因为播种到表1中的数据是在一个单独的事务中完成的

    由于我无法首先访问EF代码中的视图,因此我尝试按如下方式为表2添加种子:

    public static class MySeeder
    {
        public static ClassificationType[] GetClassificationTypes(StorageContext context)
        {
            return
                context.Database.SqlQuery<ClassificationType>(
                    "select * from vClassificationTreeXml WHERE Id=@p1",
                    new SqlParameter("p1", 1))
                        .ToArray();
        }
    
    }
    

    因此,我将上下文传递给我的函数,在那里我尝试从视图中进行种子设定。

    当您将所有内容包装到TransactionScope中时,您的种子设定方法中可以有多个
    SaveChanges()
    调用。我用种子设定代码更新了问题。但您真正建议我在事务作用域中添加Seed()方法中的所有内容,然后在每个种子设定步骤后添加context.SaveChanges()?是的,您当然可以这样做。设定(+保存)表格种子后,视图将具有FK值。在这种情况下使用TS并不少见。
    protected override void Seed(StorageContext context)
    {
        context.MyTable1.AddOrUpdate(MyTable1SeederSeeder.MyTable1s);
        // ... 
        context.ClassificationTypes.AddOrUpdate(ClassificationSeeder.GetTypes(context));
    }