Entity 在.net 3.5中更新,删除数据的方法扩展

由于添加实体在生成entity 时会自动生成方法AddToXXXX();所以此扩展不包含添加实体的方法;
 
Demo
 
public static class Test
{
public static void UpdateCustomer()
{
CRMEntityProvider crmEP=new CRMEntityProvider();
// 此处的customer实例通常为json/xml 反序列化得到
Customer customer=new Customer(){pk_customer=123,Name=”abc”};
crmEP.UpdateEntity(customer);
}
}
public class CRMEntityProvider
   {
       private Type _contextType;
       public CRMEntityProvider()
       {
           _contextType = typeof(CRMEntities);
       }
       public bool UpdateEntity<T>(T entity) where T : System.Data.Objects.DataClasses.EntityObject
       {
           _contextType.UpdateEntity(entity);
           return true;
       }
       public bool DeleteEntity<T>(T entity) where T : System.Data.Objects.DataClasses.EntityObject
       {
           _contextType.DeleteEntity(entity);
           return true;
       }
   }

 

 

 

下面是扩展方法类

 
 
public static class ObjectContextExtension
{
    /// <summary>
    /// 将entity添加到ObjectContext
    /// </summary>
    /// <typeparam name="Tentity"></typeparam>
    /// <param name="entity"></param>
    /// <param name="context"></param>
    private static void AttachEntity<Tentity>(Tentity entity, ObjectContext context) where Tentity : EntityObject
    {
        var entitySetName = (from p in context.GetType().GetProperties()
                             where p.PropertyType.FullName.Contains(typeof(Tentity).FullName)
                             select p).First().Name;
        if (entitySetName == null)
            throw new NotSupportedException("context has not an entity.");
        string entityFullname = context.DefaultContainerName + "." + entitySetName;
        context.AttachTo(entitySetName, entity);
    }

    /// <summary>
    /// 此处只更新entity的属性值不为null的
    /// </summary>
    /// <typeparam name="Tentity"></typeparam>
    /// <param name="contextType"></param>
    /// <param name="entity"></param>
    public static void UpdateEntity<Tentity>(this Type contextType, Tentity entity)
        where Tentity : EntityObject
    {
        if (!typeof(ObjectContext).IsAssignableFrom(contextType))
            throw new NotSupportedException("contextType is not an ObjectContext.");
        using (ObjectContext context=Activator.CreateInstance(contextType) as  ObjectContext)
        {
            AttachEntity<Tentity>(entity, context);
            var propertys = from p in typeof(Tentity).GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public)
                            where p.GetGetMethod(false) != null && p.GetValue(entity, null) != null
                            let attribute = (EdmScalarPropertyAttribute)Attribute.GetCustomAttribute(p, typeof(EdmScalarPropertyAttribute))
                            where attribute != null && !attribute.EntityKeyProperty
                            select p.Name;

            System.Data.Objects.ObjectStateEntry se = context.ObjectStateManager.GetObjectStateEntry(entity);
            foreach (var item in propertys)
            {
                se.SetModifiedProperty(item);
            }
            context.SaveChanges();
        }

    }

    /// <summary>
    /// 删除
    /// </summary>
    /// <typeparam name="Tentity"></typeparam>
    /// <param name="contextType"></param>
    /// <param name="entity"></param>
    public static void DeleteEntity<Tentity>(this Type contextType, Tentity entity)
        where Tentity : EntityObject
    {
         if (!typeof(ObjectContext).IsAssignableFrom(contextType))
            throw new NotSupportedException("contextType is not an ObjectContext.");
         using (ObjectContext context = Activator.CreateInstance(contextType) as ObjectContext)
         {
             AttachEntity<Tentity>(entity, context);
             context.DeleteObject(entity);
             context.SaveChanges();
         }
    }

posted on 2010-11-18 20:02  imbob  阅读(967)  评论(0编辑  收藏  举报

导航