这是从DataContext更新实体的最好方法吗?

本文关键字:方法 实体 DataContext 更新 | 更新日期: 2023-09-27 17:48:59

我发现这是从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)。我要像leadToTrack.Field1 = lead.Field1那样写200行还是有更简洁的方式?

谢谢

这是从DataContext更新实体的最好方法吗?

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

您可以附加实体并更改它的对象状态条目…

context.Leads.Attach(lead);
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(lead);
entry.ChangeState(EntityState.Modified);
context.SaveChanges();

你可以用反射来做。下面是我为此目的编写的一个类似的方法:

    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;
    }

除了传入一个要克隆的对象之外,您将传入一个源对象和一个目标对象,并将值从一个复制到另一个