我从数据库中提取了一个复杂的对象/实体,它有50-60个字段。我手工制作了一个表格,这是一个痛苦的屁股。我不想现在编写c#代码来手动应用每个属性。
我以为我能做到这一点
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
我在这个解决方案(或变体)上找到了很多类似的线程:
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,即使我的对象属于同一类。它似乎也失去了对象的引用。现在已经很晚了,我可能会做些蠢事。有人可以帮忙吗?
更新
我的AutoMapper代码:
Mapper.CreateMap<Contact, Contact>();
Mapper.Map(model.ContactWithMetaData.Contact, _contact);
db.SaveChanges();
更新2:
对不起伙计们。事实证明我是做一些愚蠢的事情。我用model.Contact
填充了我的表单,但省略了Contact.ID
的隐藏字段。因此,Contact.ID
和_contact
都是空的。现在我已经看到了我的错误,我已经回去测试了。上述两种方法都有效,而wahwahwah的方法也有效。
抱歉浪费每个人的时间!
答案 0 :(得分:0)
通过执行_contact = model.Contact;
,您将_contact
的整个引用替换为model.Contact
的引用。 _contact
引用的原始对象没有变化,因此无需保存。
答案 1 :(得分:0)
我认为这可能会有所帮助:
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那样健壮......