2011-04-04 29 views
1

我发现,这是从一个DataContext这是否是从DataContext更新实体的最佳方式?

public bool UpdateLead(Lead lead) 
    { 

     OrganizationServiceContext context = GetOrgContext(); 
     Lead leadToTrack = getLead(lead.Id, context); 
     leadToTrack.AccountId.Id = lead.AccountId.Id; 
     //... 
     context.UpdateObject(leadToTrack); 

     context.SaveChanges(); 

     return true; 
    } 

更新实体的方式,但我必须在实体约200场(感谢到Microsoft Dynamics CRM)。我是否必须写出200行,如leadToTrack.Field1 = lead.Field1,还是有更简洁的方法?

谢谢

回答

4

你可以使用AutoMapper这个 - 如果你有那么多的属性,基本上在两边都有相同的名字,这应该适合你。

+1

+1这是测绘工作,@Mathieu也看看ValueInjecter它可能使事情变得比AutoMapper您更轻松。 – 2011-04-04 18:53:38

1

你可以用反射做到这一点。这里有一个类似的方法,我写了这个目的:

public static FMVHistory CloneFMV(FMVHistory F) { 
     FMVHistory F_Clone = new FMVHistory(); 

     Type typeToClone = F.GetType(); 
     Type[] BadGenericTypes = new Type[] { typeof(EntityCollection<>), typeof(EntityReference<>) }; 
     Type[] BadTypes = new Type[] { typeof(System.Data.EntityKey) }; 

     foreach (PropertyInfo pi in typeToClone.GetProperties().Where(p => p.CanWrite)) { 
      if (pi.PropertyType.IsGenericType && BadGenericTypes.Contains(pi.PropertyType.GetGenericTypeDefinition()) 
       || (BadTypes.Contains(pi.PropertyType)) 
       || (pi.Name.Equals("nameOfYourPrimaryKeyWhichYouDontWantCloned"), StringComparison.CurrentCultureIgnoreCase))) 
       continue; 

      pi.SetValue(F_Clone, pi.GetValue(F, null), null); 
     } 
     return F_Clone; 
    } 

除,而不是在一个对象传递给被克隆,你会通过在源对象和目标对象,并从一个以上的值复制到另一个。

2

您可以将实体,并改变它的对象状态的进入......

context.Leads.Attach(lead); 

ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(lead); 
entry.ChangeState(EntityState.Modified); 
context.SaveChanges(); 
相关问题