通过使用实体框架,我的项目出现问题。我已经成功建立了这两个数据库之间的连接。我正在考虑从数据库中复制mysql数据并插入到Microsoft SQL中。我对这个实体框架相当陌生,这里有没有人可以引导我如何做到这一点?任何帮助将不胜感激。通过使用实体框架将MySql数据传输到Microsoft Sql代码
0
A
回答
0
问题在于Ids的生成。最简单和最安全的方法是让新的DbContext生成Ids,就好像元素被添加为新对象一样
唉,这意味着您必须读取旧数据库中的所有元素,并将它们添加到新的一。
using (var oldDbContext = ...)
{
using (var newDbContext = ...)
{
var oldItems = oldDbContext.OldTable.ToList();
foreach (var oldItem in oldItems)
{
var newItem = converOldItem(newItem);
// you need your Id to have default value (zero)!
var addedNewItem = newDbcontext.NewTable.Add(newItem);
}
...
newDbContext.SaveChanges();
}
}
如果您有一对多的关系,您将需要addedNewItem。例如,如果教师有很多学生,则您的教师在SaveChanges
之前不会有TeacherId
。因此,您无法将教师的ID分配给学生中的外键。你必须:
var newStudentToAdd = ConvertFromOld(oldStudent);
newSturdentToAdd.Teacher = addedTeacher;
这一切的缺点是会出现在内存中,转换过程将是相当缓慢的大量数据。优点:非常安全,在转换过程中可以进行(默认)更改。
您可以通过禁止检测目标数据库中的更改来增加速度,从而强制保存所有内容,而不检查数据是否已更改。
因为你正在创建一个新的数据库,所有数据被添加,因此,所有数据应保存,这样你就不需要更改检测:DbContextConfiguration.AutoDetectChangesEnabled Property
newDbContext.Configuration.AutoDetectChangesEnabled = false;
另一个mthod,更加危险,会重用现有的ID。如果你这样做了,你将不得不自己为所有将在转换过程后添加的项目生成ID。确保将来生成的ID与在旧数据库中生成ID的方法兼容。
如果您决定自己生成您的ID。覆盖`DbContext.SaveChanges1:
class NewDbContext : DbContext
{
...
public override int SaveChanges()
{
GenerateIds();
base.SaveChanges();
}
private void GenerateIds()
{
foreach (var addedEntry in this.ChangeTracker.Entries
.Where(entry => entry.State == EntityState.Added))
{
((IID)addedEntity).Id = idGenerator.CreateId();
}
}
}
要做到这一点,每个条目(每类是与主键的DbSet)应该有一个接口,指示主键,事情是这样的:
public interface IID
{
int Id {get; set;}
}
public class Teacher : IID
{
public int Id {get; set;}
...
}
public class Student : IID
{
public int Id {get; set;}
...
}
IdGenerator应创建与旧数据库的IdGenerator相似的ID。在转换过程中,您希望使用旧数据库的ID,因此请确保不重新创建这些ID
相关问题
- 1. 实体框架代码优先 - 使用MySql创建数据库?
- 2. 实体框架使用传输对象通过WCF发送
- 3. 使用实体框架流式传输varbinary(max)数据6
- 4. 如何使用实体框架代码优先将实体持久保存到数据库时执行代码?
- 5. 实体框架代码首先+ MySQL ... NullReferenceException
- 6. 无法使用实体框架代码将列表保存到数据库中
- 7. 实体框架 - 通过
- 8. 实体框架组通过Sql生成
- 9. 实体框架代码优先使用
- 10. 实体框架4:将Microsoft SQL 2005/2008 row_number转换为字段的C#代码?
- 11. 用实体框架将记录插入到MySQL数据库
- 12. 连接到MySQL数据库使用ASP.NET实体框架
- 13. 通过实体框架连接到Sql Azure“代码优先”ctp 5
- 14. 通过JSON传输实体框架对象的最佳方式
- 15. 只使用Ado.Net数据服务的Ado.Net实体框架代码
- 16. C#:使用实体框架代码访问数据库 - 第一
- 17. 实体框架通过wcf
- 18. 在SQL Server中使用代码优先实体框架创建数据库
- 19. 输出创建SQL实体框架4.1代码优先
- 20. 实体框架 - 如何通过实体
- 21. 使用MySql实体框架4和代码优先开发CTP
- 22. 刷新数据使用实体框架
- 23. 使用通过代码框架队列
- 24. WEB API实体框架父子过帐到SQL数据库
- 25. 将数据从SQL Server传输到MySQL
- 26. 实体框架,POCO,通过代码创建您自己的数据库?
- 27. 从LINQ到SQL到实体框架的迁移“代码优先”
- 28. 代码优先MVC 4使用实体框架和SQL Server 2012
- 29. 实体框架不会将我的数据保存到sql server
- 30. 将实体框架CLR DLL添加到SQL Server数据库
看起来您正在寻找的是在这两个DBMS之间的批量复制。包括您试图从源数据库插入批量记录到其他数据库的任何代码。 –