2014-11-22 137 views
1

我有一个从具有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的方法也适用。

对不起浪费大家的时间!

+0

Automapper应该是事情(区分大小写)。你需要,即使被映射的实例是相同的类型,它也应该可以正常工作。你可以显示该代码吗? – lesscode 2014-11-22 02:52:27

回答

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 ...

+0

这里有错字吗? contactType是无法识别的?猜测它应该是'type'? – roryok 2014-11-22 09:53:25

+0

是的 - 好点,我会更新答案。 – wahwahwah 2014-11-22 20:46:00

0

通过做_contact = model.Contact;您正在替换参考model.Contact_contact的整个参考。由_contact引用的原始对象保持不变,因此没有任何可以保存的东西。

+0

是的,我猜对了。那么如何将这些属性从一个应用到另一个而不需要经过每一个? – roryok 2014-11-22 02:52:32

+0

就我个人而言,我会使用反射来获取属性的名称,然后codegen属性分配,然后将它们粘贴到您的代码中。 “wahwahwah”有一个合适的方法,但我不喜欢在代码中看到类似的东西,因为它可能会导致稍后的微妙错误。 – Enigmativity 2014-11-22 03:21:05