2010-12-08 115 views
1

我使用LINQ將數據庫對象公開到我的應用程序中。同樣在這個應用程序中,我從我的數據庫中獲得一個名爲'foo'的對象。在LINQ中更新一個對象與另一個對象

public static Foo Get(int id) 
{ 
    MyDataContext db = new MyDataContext(); 
    Foo foo1 = (from f in db.Foos 
     where f.foo_id = id 
     select f).SingleOrDefault(); 
    return foo1; 
} 

現在,如果我改變foo和希望不通過每個字段會明確地更新它 - 我想避免這種情況。

public static Foo Update(Foo foo) 
{ 
    MyDataContext db = new MyDataContext(); 
    Foo foo1 = (from f in db.Foos 
     where f.foo_id = foo.foo_id 
     select f).SingleOrDefault(); 

    if(foo1 != null) 
    { 
     foo1.foo_nm = foo.foo_nm; 
     ... 

     db.SubmitChanges(); 
    } 
} 

有沒有一種方法,我可以不喜歡在實體框架:

foo1.UpdateVales(foo); 

回答

1

創建副本的所有屬性,你有興趣在自己的克隆方法

或者你。可以使用反射來查找所有公共屬性並通過它們循環。

LINQ在這裏沒有幫助。

1

這裏有一個非常簡單(效率也很低)擴展功能,可以讓你開始(確保導入System.ReflectionSystem.Linq):

public static void GetDataFrom<T>(this T ObjToCopyTo, T ObjToCopyFrom) where T : class { 
     foreach (var property in ObjToCopyTo.GetType().GetProperties().Where(x => x.CanWrite)) 
      property.SetValue(ObjToCopyTo, property.GetValue(ObjToCopyFrom, null), null); 
    } 

你也許會發現,你將不得不把一些特殊情況下的主鍵,並可能決定你不想完全複製每一個屬性,但希望這顯示了VVS的答案背後的想法。

如果你有linqpad安裝,你可以玩這個想法與下面的腳本:

void Main() 
{ 
    var foo = new Helper.Foo() { 
     field1 = "hi", 
     field2 = 5, 
     field3 = 3.14, 
     field4 = 'm' 
    }; 
    var foo2 = new Helper.Foo(); 
    foo.Dump("Foo Before"); 
    foo2.Dump("Foo2 Before"); 
    foo2.GetDataFrom(foo); 
    foo.Dump("Foo After"); 
    foo2.Dump("Foo2 After"); 
} 

public static class Helper { 

    public class Foo { 
     public string field1 { get; set; } 
     public int field2 { get; set; } 
     public double field3 { get; set; } 
     public char field4 { get; set; } 
    } 

    public static void GetDataFrom<T>(this T ObjToCopyTo, T ObjToCopyFrom) where T : class { 
     foreach (var property in ObjToCopyTo.GetType().GetProperties().Where(x => x.CanWrite)) 
      property.SetValue(ObjToCopyTo, property.GetValue(ObjToCopyFrom, null), null); 
    } 

} 

我希望這有助於!

1

我使用automapper來避免繁重的工作來更新數據庫與MVC模型,應該工作映射到相同的對象類型,並派上用場這些類型的編碼風格。

安裝automapper後...

public ActionResult Example(TableModel model) 
{ 
    .. 
    Mapper.CreateMap<TableModel, Table>(); 
    Table myTable = new Table(); 
    Mapper.Map(model, myTable); 
    ... 
} 
相關問題