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   imbob  阅读(969)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2010年11月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11
点击右上角即可分享
微信分享提示