我使用LINQ将数据库对象公开给我的应用程序。同样在这个应用程序中,我从我的数据库中得到一个名为'foo'的对象,就像这样。
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);
答案 0 :(得分:1)
创建您自己的克隆方法,复制您感兴趣的所有属性。
或者,您可以使用反射来查找所有公共属性并循环遍历它们。
LINQ在这里没有帮助。
答案 1 :(得分:1)
这是一个非常简单(也是低效)的扩展功能,可以帮助您入门(确保导入System.Reflection
和System.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);
}
}
我希望这有帮助!
答案 2 :(得分:1)
我使用automapper来避免繁重的工作来更新数据库与MVC模型,应该适用于映射到相同的对象类型,并为这些类型的编码样式派上用场。
安装后自动播放器......
public ActionResult Example(TableModel model)
{
..
Mapper.CreateMap<TableModel, Table>();
Table myTable = new Table();
Mapper.Map(model, myTable);
...
}