Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 检查插入时的SQL引用约束,但不检查删除时的SQL引用约束_C#_Sql_Entity Framework - Fatal编程技术网

C# 检查插入时的SQL引用约束,但不检查删除时的SQL引用约束

C# 检查插入时的SQL引用约束,但不检查删除时的SQL引用约束,c#,sql,entity-framework,C#,Sql,Entity Framework,我的数据库中有一个Logs表,我在其中存储用户操作的记录。有一个UserID列,它是Users表的外键,用于在添加日志时检查UserID是否存在。但是,尝试删除用户会导致约束失败,因为它会在日志表中留下一个UserID,而该Users表中不再存在该UserID。从日志中删除有问题的行不是一个选项,因为关键是要有持久的记录(这样我们就可以找出谁破坏了什么,基本上),所以删除该用户的所有操作反而会达不到目的 有没有一种简单的方法可以让it在插入新日志时检查约束(以确保用户当时存在),而不是在删除用户

我的数据库中有一个Logs表,我在其中存储用户操作的记录。有一个UserID列,它是Users表的外键,用于在添加日志时检查UserID是否存在。但是,尝试删除用户会导致约束失败,因为它会在日志表中留下一个UserID,而该Users表中不再存在该UserID。从日志中删除有问题的行不是一个选项,因为关键是要有持久的记录(这样我们就可以找出谁破坏了什么,基本上),所以删除该用户的所有操作反而会达不到目的

有没有一种简单的方法可以让it在插入新日志时检查约束(以确保用户当时存在),而不是在删除用户时检查约束?我通过LINQ访问数据库,所以我的查询是C#,而不是SQL,所以需要的任何东西都不存在,但我可以通过MS SQL Server Management Studio访问数据库,所以我可以用它做我喜欢的事情


编辑稍作澄清:知道谁采取了行动的价值不仅仅在于问责;它有助于确定问题是用户特定的、组织特定的还是系统范围的,这可以大大缩小可能原因的范围。一旦用户被删除,仍然值得保留他们的操作,并且出于各种原因,知道该用户执行了哪些操作仍然很有用-例如,当跟踪一个用户执行某些组合操作(例如,两个单独的操作很好,但一个接一个操作会导致错误)时.

如果您真的想保留日志,则永远不应完全删除该用户

与其删除用户记录,不如更改其状态以指示它已被删除,这样数据库仍然具有引用完整性


或者,打开级联删除,这样当您删除用户时,日志将同时全部删除,这是保持引用完整性的另一种方法。

您可以使日志表主键(复合键)独立于用户ID。更改对日志表进行索引的方式可以解决此问题。还要确保没有级联删除

坦率地说,如果一个用户被永远删除了,知道谁打破了什么又有什么用呢?除非你打算永远缠着那个人,或者不让那个用户参与到你的库存中去……;)

否则,如果从系统中删除某个用户,您可以限制该用户日志的搜索能力,如果该选项对您有效的话


然而,保留一个至少包含UserID和Name的简单表并不是一个坏主意。

如果你想知道谁打破了什么?对于已删除的记录,您可以在用户表中创建一列“Isactive”作为位数据类型。用户删除时,您可以将位值更改为“0”,而不是删除记录。用户创建时,将该字段设置为1。是scenerio的唯一选择


希望这对您有所帮助

您可以删除约束(保留列),并且仅在用户exists@Yoav我想尝试一下,但它需要日志存储库访问用户存储库,这与我们正在使用的存储库模式背道而驰。存储库并不意味着彼此接触。虽然我想我可以让它成为一个日志服务,有一个日志存储库和一个用户存储库,这不会违反模式。他说“从日志中删除有问题的行不是一个选项”,所以第二个建议不合适。@Barmar我同意-但这是一个问答网站,所以下一个读到这个答案的人可能会认为这是他们的选择。