Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保留有关已删除实体的信息_C#_Sql Server_Nhibernate - Fatal编程技术网

C# 保留有关已删除实体的信息

C# 保留有关已删除实体的信息,c#,sql-server,nhibernate,C#,Sql Server,Nhibernate,在我们的项目中,我们需要能够说出删除某个实体的人和时间。 因此,经过一些调查,我找到了下一个解决方案: 将IsDeleted和DeletedBy列添加到每个表中,并在删除前进行设置(使用NH的delete事件)。但是这个解决方案有一些缺点:我们有很多sql视图,它们应该只处理未删除的数据。所以为了实现这一点,我们应该在每个表上写视图,这类似于一个过滤器。(其中IsDeleted=0) 删除前将每个实体序列化为xml,并将其存储在单个单独的表中,下一个表的结构为:Id | xml | Delete

在我们的项目中,我们需要能够说出删除某个实体的人和时间。 因此,经过一些调查,我找到了下一个解决方案:

  • 将IsDeleted和DeletedBy列添加到每个表中,并在删除前进行设置(使用NH的delete事件)。但是这个解决方案有一些缺点:我们有很多sql视图,它们应该只处理未删除的数据。所以为了实现这一点,我们应该在每个表上写视图,这类似于一个过滤器。(其中IsDeleted=0)
  • 删除前将每个实体序列化为xml,并将其存储在单个单独的表中,下一个表的结构为:
    Id | xml | Deleted By
  • 从您的角度来看,这些解决方案中哪一个更受欢迎,或者可能还有其他我在上面没有提到的解决方案

    p.S.删除的行应从查询中排除(Nhibernate和SQL)。

    我看到三个选项:

  • 硬删除。这些行不存在
  • 软删除。正如你所描述的。是的,你必须在每一个地方都加上已删除的支票。到处都是。到处都是。真是太痛苦了

  • 存档表。创建一个与现有表完全相同的表…并在事务中执行移动(到存档表)和删除(从原始表)

  • 我曾与2号和3号一起工作过。我更喜欢3号,因为你避免了随处可见的附加条款


    使用#2,您可能还必须找出允许1个非软删除行的约束(基于唯一约束),但也允许违反唯一约束的软删除行的重复。是的,好时光。

    我也会考虑数据库链接,你也可以考虑存档表。如果您有一个可为空的
    DeletedBy
    IsDeleted
    ,那么这是一个快速提示,因为
    DeletedBy
    !=空表示删除。谢谢你的留言,本。Oleksii,数据库触发器不知道删除行的应用程序用户的任何信息,或者我没有想到你的评论。