2017-07-19 50 views
0

通过使用实体框架,我的项目出现问题。我已经成功建立了这两个数据库之间的连接。我正在考虑从数据库中复制mysql数据并插入到Microsoft SQL中。我对这个实体框架相当陌生,这里有没有人可以引导我如何做到这一点?任何帮助将不胜感激。通过使用实体框架将MySql数据传输到Microsoft Sql代码

+0

看起来您正在寻找的是在这两个DBMS之间的批量复制。包括您试图从源数据库插入批量记录到其他数据库的任何代码。 –

回答

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

相关问题