当前位置: 首页 > 编程语言 > C#

使用数据库拦截器的entity framework软删除实现不起作用分享

时间:2023-04-10 21:53:34 C#

C#学习教程:使用数据库拦截器的实体框架软删除实现不起作用/csharp/soft-deleting-entities-cleanly-using-entity-framework-6-interceptors.html在我看来,这是一个非常好的实现,因为一旦设置了软删除,就可以通过添加[SoftDelete("IsDeleted")]注解。问题到目前为止它没有工作。来源似乎是可靠的,他们甚至发布了他们的解决方案示例:https://github.com/rakeshbabuparuchuri/EFExpensionPoints如果我在对我的项目应用软删除时做错了什么,你能看看我的代码吗?这是模型:[SoftDelete("IsDeleted")]publicclassBC_Instance{publicintID{get;放;}publicboolIsDeleted{得到;放;}}ApplicationDbContext.cs:namespacebcplatform2.Models{publicclassApplicationDbContext:IdentityDbContext{publicApplicationDbContext():base("DefaultConnection",throwIfV1Schema:false){}//为每个实体添加一个DbSet//publicDbSetVirtualGuests{得到;放;}publicDbSetBiocloudInstances{get;放;}staticApplicationDbContext(){Database.SetInitializer(newApplicationDbInitializer());}publicstaticApplicationDbContextCreate(){returnnewApplicationDbContext();}protectednewvoidOnModelCreating(DbModelBuildermodelBuilder){varconv=newAttributeToTableAnnotationConvention("SoftDeleteColumnName",attributes)=>attributes.Single().ColumnName);modelBuilder.Conventions.Add(conv);}}}ApplicationDbConfiguration.cs命名空间bcplatform2.DAL{公共类ApplicationDbConfiguration:DbConfiguration{publicApplicationDbConfiguration(){AddInterceptor(newSoftDeleteInterceptor());}}}SoftDeleteAttribute.cs:namespacebcplatform2.Helpers{publicclassSoftDeleteAttribute:Attribute{publicSoftDeleteAttribute(stringcolumn){ColumnName=column;}publicstringColumnName{get;放;}publicstaticstringGetSoftDeleteColumnName(EdmTypetype){MetadataPropertyannotation=type.MetadataProperties.Where(p=>p.Name.EndsWith("customannotation:SoftDeleteColumnName")).SingleOrDefault();返回注释==null?null:(string)annotation.Value;}}}SoftDeleteInterceptor.cs我注意到SoftDeleteAttribute.GetSoftDeleteColumnName(deleteCommand.Target.VariableType.EdmType)找不到软件删除属性并返回null但我不知道为什么。命名空间bcplatform2.Helpers{publicclassSoftDeleteInterceptor:IDbCommandTreeInterceptor{publicvoidTreeCreated(DbCommandTreeInterceptionContextinterceptionContext){if(interceptionContext.OriginalResult.DataSpace==DataSpace.SSpace){varqueryCommand=interceptionContext.ResultasDbQueryCommandTree;if(queryCommand!=null){varnewQuery=queryCommand.Query.Accept(newSoftDeleteQueryVisitor());interceptionContext.Result=newDbQueryCommandTree(queryCommand.MetadataWorkspace,queryCommand.DataSpace,newQuery);}vardeleteCommand=interceptionContext.OriginalResultasDbDeleteCommandTree;如果(deleteCommand!=null){varcolumn=SoftDeleteAttribute.GetSoftDeleteColumnName(deleteCommand.Target.VariableType.EdmType);if(column!=null){varsetClauses=newList();vartable=(EntityType)deleteCommand.Target.VariableType.EdmType;if(table.Properties.Any(p=>p.Name==column)){setClauses.Add(DbExpressionBuilder.SetClause(DbExpressionBuilder.Property(DbExpressionBuilder.Variable(deleteCommand.Target.VariableType,deleteCommand.Target.VariableName),列),DbExpression.FromBoolean(true)));}varupdate=newDbUpdateCommandTree(deleteCommand.MetadataWorkspace,deleteCommand.DataSpace,deleteCommand.Target,deleteCommand.Predicate,setClauses.AsReadOnly(),null);interceptionContext.Result=update;}}}}}}IdentityConfig.cs公共类ApplicationDbInitializer:DropCreateDatabaseIfModelChanges{protectedoverridevoidSeed(ApplicationDbContextcontext){InitializeIdentityForEF(context);基地。种子(上下文);}//CreateUser=Admin@Admin.comwithpassword=Admin@123456intheAdminrolepublicstaticvoidInitializeIdentityForEF(ApplicationDbContextdb){//初始化用户和角色...}}ApplicationDbContext.cs中存在一个错误:protectednewvoidOnModelCreating(DbModelBuildermodelBuilder){...}您正使用“new”而不是“override”,因此永远不会执行OnModelCreating(尝试添加一个断点来检查它)因此AttributeToTableAnnotationConvention永远不会运行并且永远不会添加实体注释。将其更改为protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){...}将使它工作好吧,你的代码对我来说似乎很好。也许一个小错误会破坏您的应用程序。你可以试试这个:从BC_Instance中删除BC_InstancemodelBuilder.Conventions.Add(conv);//这会将属性动态添加到所有模型modelBuilder.Types().Configure(delegate(ConventionTypeConfigurationi){i.HasTableAnnotation("SoftDeleteColumnName",Entity.GetSoftDeleteColumnName());});删除ApplicationDbConfiguration类编辑上下文的构造函数publicApplicationDbContext():base("DefaultConnection",throwIfV1Schema:false){DbInterception.Add(newSoftDeleteInterceptor());}希望这可以帮助!以上为C#学习教程:使用数据库拦截器实体框架软删除实现所有无效内容不代表立场,如涉及侵权请点击右边联系管理员删除。如需转载请注明出处: