[英]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.