EF 5条件映射
我在我的MVC应用程序中使用EF 5 Database第一种方法。 我的所有表都使用一个名为Deleted的字段,这是一个标记记录被删除的布尔字段。
我试图摆脱每次查询我的数据库时必须检查Deleted == false的要求。 这种非常直接的方法是在edmx文件中使用条件映射,其中EF始终返回未删除的数据。 这一切都很好。
但是,这个条件映射的问题在于,当我想允许用户从地址簿中删除例如地址的某些记录时,我无法访问EF中的删除字段,因为我在条件映射中使用它,因此我必须寻找另一个选项,允许用户删除记录。
我想的方法是创建一个处理删除查询的存储过程,并在我想删除记录时调用它。
有更好的方法吗? 是否可以使删除字段可访问,即使它在条件映射中使用?
我有一个工作解决方案,可以帮助entity frameworkCode First中的软删除 。
关键是你要为每个你想要软删除的模型添加一个鉴别器。 在代码中首先是这样做的:
modelBuilder.Entity
这使得它对上下文不可见,因此您必须使用sql进行删除。
如果这相当于Database First中的“条件映射”,那么修改sql的一种方法是覆盖SaveChanges并从那里运行sql:
public override int SaveChanges() { foreach (var entry in ChangeTracker.Entries() .Where(p => p.State == EntityState.Deleted && p.Entity is ModelBase))//I do have a base class for entities with a single //"ID" property - all my entities derive from this, //but you could use ISoftDelete here SoftDelete(entry); return base.SaveChanges(); } private void SoftDelete(DbEntityEntry entry) { var e = entry.Entity as ModelBase; string tableName = GetTableName(e.GetType()); Database.ExecuteSqlCommand( String.Format("UPDATE {0} SET IsDeleted = 1 WHERE ID = @id", tableName) , new SqlParameter("id", e.ID)); //Marking it Unchanged prevents the hard delete //entry.State = EntityState.Unchanged; //So does setting it to Detached: //And that is what EF does when it deletes an item //https://msdn.microsoft.com/en-us/data/jj592676.aspx entry.State = EntityState.Detached; }
用于获取表名的方法在此解释
这就是我以前的做法。 可能与EF5中的Database First方法无关,但我现在已经开始在存储过程中执行此操作。 EF6 Code First在迁移文件中生成CreateStoredProcedure
调用。 我this.CreateDeleteProcedure("dbo.Foo_Delete", "[dbo].[Foos]");
替换为this.CreateDeleteProcedure("dbo.Foo_Delete", "[dbo].[Foos]");
– 这是对我自己的扩展方法的调用:
上述就是C#学习教程:EF 5条件映射分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
public static class MigrationExtensions { internal static string DeleteSqlFormat { //I also hard delete anything deleted more than a day ago in the same table get { return "DELETE FROM {0} WHERE IsDeleted = 1 AND DATEADD(DAY, 1, DeletedAt) < GETUTCDATE(); UPDATE {0} SET IsDeleted = 1, DeletedAt = GETUTCDATE() WHERE ID = @ID;"; } } internal static void CreateDeleteProcedure(this DbMigration migration, string procName, string tableName) { migration.CreateStoredProcedure( procName, p => new { ID = p.Int(), }, body: string.Format(MigrationExtensions.DeleteSqlFormat, tableName) ); } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1015563.html