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(); } }
版权声明:本文原创发表于 博客园,作者为 imbob,博客 http://imbob.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。