函數對照表
LINQ 2 SQL | EF | 注釋 |
DataContext | ObjectContext | |
.SubmitChanges | .SaveChanges | |
.GetTable<> | .CreateObjectSet<> | |
Table<T> | ObjectSet<T> | |
.InsertOnSubmit | .InsertObject | |
.InsertAllOnSubmit | 無 | |
.DeleteOnSubmit | .DeleteObject | |
.DeleteAllOnSubmit | 無 | |
.LoadWith | Include | 但參數不同 |
ㄋ
從表中看出,我們需要補3個Extension Method。
前兩個好辦,用Foreach調用InsertObject和DeleteObject即可:
public static void DeleteAllOnSubmit<TEntity>(this ObjectSet<TEntity> table, IEnumerable<TEntity> entities)
where TEntity : class, new()
{
foreach (TEntity entity in entities)
{
table.Detach(entity);
}
}
public static void InsertAllOnSubmit<TEntity>(this ObjectSet<TEntity> table, IEnumerable<TEntity> entities)
where TEntity : class, new()
{
foreach (TEntity entity in entities)
{
table.AddObject(entity);
}
}
LoadWith轉成Include就麻煩的,LoadWith的參數是Expression<Func<T, object>> expression,而Include的參數是string,我想不通,我們偉大的微軟怎麼會用String做參數!好吧,那就只能反射了
public static ObjectQuery<T> Include<T>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> subSelector)
{
return mainQuery.Include(((subSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name);
}
其實,多人開發時,還會遇到文件被遷出的問題,這時,可以用Extension Method保證函數名不改,程式仍可用,如下:
public static class Linq2EFExtensions
{
public static void ExecuteCommand(this ObjectContext context, string sql)
{
context.ExecuteStoreCommand(sql);
}
public static void ExecuteCommand(this ObjectContext context, string sql, params string[] parameters)
{
context.ExecuteStoreCommand(sql, parameters);
}
public static IEnumerable<TEntity> ExecuteQuery<TEntity>(this ObjectContext context, string sql, params string[] parameters)
{
return context.ExecuteStoreQuery<TEntity>(sql, parameters);
}
public static void InsertOnSubmit<TEntity>(this ObjectSet<TEntity> table, TEntity entity)
where TEntity : class, new()
{
table.AddObject(entity);
}
public static void DeleteOnSubmit<TEntity>(this ObjectSet<TEntity> table, TEntity entity)
where TEntity : class, new()
{
table.DeleteObject(entity);
}
}
好,經過幾個步驟,完成了從LINQ2SQL升級Entity Framework。
問題,在Entity Framework中,帶下划線的表,如User_Role不能的變成User_Roles,而Linq 2 Sql可以,