Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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# 实体框架数据插入对于包含750个表的数据库来说性能不佳_C#_Sql Server 2008_Entity Framework 4 - Fatal编程技术网

C# 实体框架数据插入对于包含750个表的数据库来说性能不佳

C# 实体框架数据插入对于包含750个表的数据库来说性能不佳,c#,sql-server-2008,entity-framework-4,C#,Sql Server 2008,Entity Framework 4,我们编写了一个简单的代码来生成750个类,这些类的名称从MyObj0到MyObj749,每个类有1个int(ID)和10个字符串属性,没有导航属性,也没有外键作为开始 我们这样做的原因是我们希望使用EF,但我们的生产数据库包含cca 700-800表 这是头等舱的样品 public class MyObj0 { public int MyObj0ID { get; set; } public string Name0 { get; set; } public string

我们编写了一个简单的代码来生成750个类,这些类的名称从MyObj0到MyObj749,每个类有1个int(ID)和10个字符串属性,没有导航属性,也没有外键作为开始

我们这样做的原因是我们希望使用EF,但我们的生产数据库包含cca 700-800表

这是头等舱的样品

public class MyObj0
{
    public int MyObj0ID { get; set; }
    public string Name0 { get; set; }
    public string Name1 { get; set; }
    public string Name2 { get; set; }
    public string Name3 { get; set; }
    public string Name4 { get; set; }
    public string Name5 { get; set; }
    public string Name6 { get; set; }
    public string Name7 { get; set; }
    public string Name8 { get; set; }
    public string Name9 { get; set; }
}
DbContext类

class Db : DbContext
{
    public DbSet<MyObj0> MyObj0s { get; set;}
    public DbSet<MyObj1> MyObj1s { get; set;}
    ...
    public DbSet<MyObj749> MyObj749s { get; set;}
}
EF是否有我们尚未遇到的性能捕获?还是EF在这个阶段不适合大型数据库? (我们已经在很多小项目中使用过它,而且运行非常顺利)

编辑

根据拉迪斯拉夫的问题:

尝试在第一行之后插入另一行要快得多。00562毫秒。 不幸的是,SaveChanges操作仍然需要大约3500毫秒

在另一次观察之后,我发现在插入第一行时,应用程序消耗了大量内存,从几兆字节到大约65兆字节,并且在调用SaveChanges后又增加了10mb。因此,在我看来,对于第一行操作,有一些初始化过程我还没有了解

尽管如此,知道这一点,如果我在应用程序启动时插入一些虚拟数据,我可以轻松避免第一次操作的延迟。 (应用程序的启动时间并不重要,因为它会在web项目中使用,而且每个人,甚至客户端,在部署过程中都会出现某种延迟)

有人能解释一下这背后的行为吗?我真的认为我们忽略了一些重要的事情

编辑2


在又一次尝试之后,我发现调用另一个SaveChanges()几乎不需要任何东西,0,05毫秒。因此,我们可以愉快地插入一个虚拟行,然后调用SaveChanges(),一切都应该正常工作。但这种方法只是。。。不好的。我忘了什么东西了吗?因为我不知道,除了函数SetInitializer,还有什么是重要的…

我将EF用于包含1000多个表的数据库。为什么每次都要重新创建数据库?如果尝试添加两条记录,有什么区别?肖恩·巴洛:为什么每次都要重新创建数据库?带有SetInitializer(null)的行应该跳过数据库creationRadislav Mrkna:插入第二行几乎是即时的,请参见问题底部的我的回答
Database.SetInitializer<Db>(null); //comment this line to create the DB

Stopwatch stopw = new Stopwatch();
stopw.Start();

Db db = new Db();
db.Configuration.AutoDetectChangesEnabled = false;
Console.WriteLine("Db init: " + stopw.Elapsed.TotalMilliseconds.ToString());

stopw.Restart();

db.MyObj0s.Add(new MyObj0() { Name0 = "name" });

Console.WriteLine("Row insertion: " + stopw.Elapsed.TotalMilliseconds.ToString());

stopw.Restart();

db.SaveChanges();

Console.WriteLine("Save changes: " + stopw.Elapsed.TotalMilliseconds.ToString());

Console.ReadLine();
return;
Db init: 616,3831 
(which is ok if we consider that this happens only 
 when the application starts)

Row insertion: 7663,673 
(7 seconds to insert a row. Not ok at all.)

Save changes: 3647,1969 
(3 seconds to insert a row into the database. Not ok at all)