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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述