簡體   English   中英

使用實體框架將MySql數據轉換為Microsoft Sql

[英]MySql data to Microsoft Sql by using Entity Framework

通過使用實體框架,我的項目出現了問題。 我已經成功建立了這兩個數據庫之間的連接。 我當時想從數據庫中復制mysql數據並插入到Microsoft sql中。 我對這個實體框架還很陌生,這里有人可以指導我如何做到這一點嗎? 任何幫助將不勝感激。

問題是Ids的生成。 最簡單,最安全的方法是讓新的DbContext生成ID,就像將元素添加為新對象一樣

las,這意味着您必須從舊數據庫中讀取所有元素,然后將它們添加到新數據庫中。

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;

所有這些的缺點是內存中將有很多數據,並且轉換過程將相當慢。 優點:非常安全,並且在轉換過程中可以進行(默認)更改。

您可以通過在目標DB中禁用更改檢測來提高速度,從而強制保存所有內容,而無需檢查數據是否已更改。

因為要創建新數據庫,所以將添加所有數據,因此應保存所有數據,因此不需要進行更改檢測: DbContextConfiguration.AutoDetectChangesEnabled屬性

newDbContext.Configuration.AutoDetectChangesEnabled = false;

另一個方法(更危險)是重用現有的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();
        }
    }
}

為此,每個Entry(具有主鍵的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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM