我刚刚发现LINQ并发现它很棒。一个问题是,我必须在3层(层)应用程序的更新期间复制大量字段。我使用的算法显示了类的典型LINQ更新。
FromPresentation
。以及相应的代码:
using (var ctx = new AppDataDataContext())
{
var OBJ =
(from Usu in ctx.usuarios
where Usu.ID == FromPresentation.ID
select Usu).SingleOrDefault();
if (OBJ != null)
{
OBJ.Nome = FromPresentation.Nome;
OBJ.NomeCurto = FromPresentation.NomeCurto;
OBJ.Login = FromPresentation.Login;
OBJ.Senha = FromPresentation.Senha;
OBJ.SuperUsuario = FromPresentation.SuperUsuario;
OBJ.Ativo = FromPresentation.Ativo;
// a lot more fields
ctx.SubmitChanges();
return OBJ.ID;
}
}
问题在于我有很多领域。我甚至尝试使用反射(using this question for guidance)来复制字段,但LINQ没有得到更改的通知,因此它不会保存任何内容。
如何使用反射将值复制到LINQ对象,以便可以在数据库中更新?
答案 0 :(得分:4)
不要使用反射,这将重新发明轮子 - 使用像AutoMapper这样的映射器为你完成工作。
AutoMapper使用流畅的配置API来定义对象对象 映射策略。 AutoMapper使用基于约定的匹配 用于匹配源到目标值的算法。目前, AutoMapper面向模型投影场景以展平 复杂的对象模型,以DTO和其他简单的对象,其设计 更适合序列化,通信,消息传递或 只是域和应用程序之间的反腐败层 层
答案 1 :(得分:0)
您可以尝试更新属性而不是字段。
例如
private static void UpdateForType(Type type, MyObject source, MyObject destination)
{
var myObjectProperties = type.GetProperties(
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo pi in myObjectProperties)
pi.SetValue(destination, pi.GetValue(source, null), null);
}