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

时间:2011-04-04 18:45:18

标签: c# visual-studio linq linq-to-sql

我发现这是从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或者是否有更简洁的方法?

由于

3 个答案:

答案 0 :(得分:4)

你可以使用AutoMapper - 如果你有许多属性,双方基本上都有相同的名字,这对你来说应该很有用。

答案 1 :(得分:2)

您可以附加实体并更改其对象状态条目...

context.Leads.Attach(lead);

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

答案 2 :(得分: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;
    }

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