将linq对象的属性设置为另一个的属性
我有一个从具有50-60个字段的数据库中拉出的复杂对象/实体。我已经为此手工生成了一个表单,这是一个在流浪汉中的痛苦。我不想现在编写C#代码来手动应用每个属性。将linq对象的属性设置为另一个的属性
我想我能做到这一点
using (DataContext db = new DataContext())
{
var _contact = db.Contact.Where(x => x.ID == model.Contact.ID).FirstOrDefault();
_contact = model.Contact;
db.SaveChanges();
}
然而,这并没有更新对象。我想,当我设置_contact = model.Contact
我发现了很多类似的线程上SO用此溶液(或变化),以原始的基准丢失:
var notNullProps = typeof(Contact).GetProperties()
.Where(x => x.GetValue(model.Contact, null) != null);
foreach (var p in notNullProps)
{
p.SetValue(_contact, p.GetValue(model.ContactWithMetaData.Contact, null), null);
}
然而,这总是会引发错误Non-static method requires a target
我甚至尝试过使用AutoMapper,即使我的对象是同一类。它似乎也失去了对象的引用。这很晚了,我可能会做一些愚蠢的事情。谁能帮忙?
UPDATE:
我AutoMapper代码:
Mapper.CreateMap<Contact, Contact>();
Mapper.Map(model.ContactWithMetaData.Contact, _contact);
db.SaveChanges();
更新2:
对不起乡亲。原来我是做一些愚蠢的事情。我用model.Contact
填写我的表格,但省略了隐藏字段Contact.ID
。结果Contact.ID
和_contact
都是无效的开始。现在我看到了我的错误,我已经回去测试了。上述两种方法都适用,wahwahwah的方法也适用。
对不起浪费大家的时间!
我想这可能帮助:
public void SetProperties(object source, object target)
{
var contactType = target.GetType();
foreach (var prop in source.GetType().GetProperties())
{
var propGetter = prop.GetGetMethod();
var propSetter = contactType.GetProperty(prop.Name).GetSetMethod();
var valueToSet = propGetter.Invoke(source, null);
propSetter.Invoke(target, new[] { valueToSet });
}
}
只有工作,如果两个对象的性质是完全一样的不一样强大AutoMapper ...
通过做_contact = model.Contact;
您正在替换参考model.Contact
_contact
的整个参考。由_contact
引用的原始对象保持不变,因此没有任何可以保存的东西。
是的,我猜对了。那么如何将这些属性从一个应用到另一个而不需要经过每一个? – roryok 2014-11-22 02:52:32
就我个人而言,我会使用反射来获取属性的名称,然后codegen属性分配,然后将它们粘贴到您的代码中。 “wahwahwah”有一个合适的方法,但我不喜欢在代码中看到类似的东西,因为它可能会导致稍后的微妙错误。 – Enigmativity 2014-11-22 03:21:05
Automapper应该是事情(区分大小写)。你需要,即使被映射的实例是相同的类型,它也应该可以正常工作。你可以显示该代码吗? – lesscode 2014-11-22 02:52:27