- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个MySql数据库,其一般结构如下:
Manufacturer <== ProbeDefinition <== ImagingSettings
ElementSettings ====^ ^==== ProbeInstance
我使用 InnoDB 来允许外键,并且所有指向 ProbeDefinition
的外键都设置了 ON DELETE CASCADE
。
我遇到的问题是,当我删除代码中的 ProbeDefinition
时,它会立即重新插入。级联删除正确发生,因此其他表被清除,但 LINQ to SQL 似乎可能无缘无故地发送插入。检查数据库上的 ChangeSet 属性显示 1 次删除,没有插入。
我使用以下一小段代码来执行删除:
database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();
MySql 中的日志显示运行时正在执行以下命令:
BEGIN
use `wetscoprobes`; DELETE FROM wetscoprobes.probedefinition WHERE ID = 10
use `wetscoprobes`; INSERT INTO wetscoprobes.probedefinition (CenterFrequency, Elements, ID, IsPhased, ManufacturerID, Name, Pitch, Radius, ReverseElements) VALUES (9500000, 128, 10, 1, 6, 'Super Probe 2', 300, 0, 1)
COMMIT /* xid=2424 */
什么可能导致这种不必要的INSERT
?请注意,以完全相同的方式删除 Manufacturer
会正确删除,日志如下:
BEGIN
use `wetscoprobes`; DELETE FROM wetscoprobes.manufacturer WHERE ID = 9
COMMIT /* xid=2668 */
编辑:经过进一步测试,似乎只有在我用 ProbeDefinition
列表填充 ListBox 后才会发生这种情况。
我尝试在以下代码段运行之前和之后运行上面的删除代码:
var manufacturer = (Manufacturer)cbxManufacturer.SelectedItem;
var probes = manufacturer.ProbeDefinition;
foreach (var probe in probes)
{
cbxProbeModel.Items.Add(probe);
}
该对象在所述代码运行之前被正确删除,但在此之后的任何时候,它都会在删除后执行插入。它不喜欢该对象在某处被引用的事实吗?
这是我正在运行的代码,用于测试从中间窗口删除定义:
database.ProbeDefinition.DeleteOnSubmit(database.ProbeDefinition.Last())
database.SubmitChanges()
最佳答案
事实证明,当对象有多个引用时就会出现问题。通过逐步浏览 DbLinq 源代码,我了解到在完成 DELETE 后,它会逐步遍历所有其他“监视”对象,查找引用。
在本例中,我通过表 database.ProbeDefinition
以及制造商引用 manufacturer.ProbeDefinition
获得了多个引用。在我通过这两种方法访问对象之前,这不是问题。使用Remove
可以从制造商中删除引用,使用DeleteOnSubmit
将从表中删除该对象。如果我执行其中之一,则另一个引用仍然存在,因此该对象被标记为要重新插入。我不确定这是否是 DbLinq 中的一个错误,它不会删除其他引用或预期行为。
无论哪种方式,就我而言,解决方案是仅使用一种方法访问表,然后使用该方法删除,或者使用两种方法删除。为了让它正常工作,我使用了第二种方法:
// Delete probe
this.manufacturer.ProbeDefinition.Remove(probe);
database.ProbeDefinition.DeleteOnSubmit(probe);
database.SubmitChanges();
编辑:在对项目和类似问题进行进一步研究后,我发现了我的实现的真正根本问题。我有一个长期存在的 DataContext,并且根据缓存的工作原理(使 SubmitChanges 工作),您无法执行此操作。 真正的解决方案是拥有一个短暂的 DataContext,并在每个方法中重新连接到数据库。
关于c# - 删除后对象立即重新插入数据库(DbLinq),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2157746/
我有一个MySql数据库,其一般结构如下: Manufacturer <== ProbeDefinition <== ImagingSettings ElementSettings ====^
我们正在开发一个带有 C# 代码的 ASP.NET Web 应用程序。数据库是MySQL 5.1,使用InnoDB。数据访问层使用 ADO.NET 调用存储过程,然后根据结果集构建各种数据结构(无对象
我有一个通过 DbLinq 连接到 MySQL 数据库的 ASP.NET MVC2 站点。网站上有一组定期完成的特定操作,包括循环处理几个表中的一组特定记录并更新它们,以及在其他一些表中添加一些新记录
我正在开发一个需要与数据库对话的应用程序。该应用程序是用 C# 编写的。我非常喜欢 LINQ 和自动生成类来表示数据库及其表,所以首先我考虑使用 SQL,因为 .NET 仅支持 LINQ to SQL
我正在开发一个需要与数据库对话的应用程序。该应用程序是用 C# 编写的。我非常喜欢 LINQ 和自动生成类来表示数据库及其表,所以首先我考虑使用 SQL,因为 .NET 仅支持 LINQ to SQL
有人可以发布一个使用 DBLinq、SQLite 进行工作连接的小代码示例吗?我已经在 VS 2010 WPF 环境中努力让它启动并运行两天了。我想我已经解决了连接字符串,但很想看到示例的启动和运行。
我试过了 db.Table1.GroupJoin(db.Table2, t1 => t1.Id, t2 => t2.t1Id, (t1,g) => new { t1, g })
我对数据库编程不是很熟悉,但我有一个Mysql数据库,我在C#下使用Dblinq访问它。现在,当我输入日期、数字等时,使用英语符号,但我的客户需要德语。如何将我的数据库从英语切换为德语? (数据库仍然
请提供命令行工具 dbmetal 从 sqlite 数据库生成代码文件的示例。 最佳答案 上网冲浪我发现了以下命令: DBMetal.exe /namespace:Namespace /provide
我已经(经过一些重大努力)让 DbLinq 在 OS X 上使用最新版本的 Mono。 有没有人通过 DbLinq/Sqlite 成功创建数据库实体? 例如,我有下表: CREATE TABLE Us
我尝试使用 DbLinq 创建 linq-to-sqlite dbml但徒劳无功。每次我遇到不同类型的错误。可能是我哪里错了。 谁能告诉我从 Dblinq 源代码创建 dbml 文件的分步过程。 最佳
当我 bool? isApproved = null; db.Table.Where(item => item.IsApproved == isApproved).Count(); 最后一行的值为0。
我正在通过 DbLINQ 使用 LINQ to SQL (PostgreSQL)。 我在执行 LINQ to PostgreSQL 时遇到问题。我用 dbmetal 成功生成了 .dbml 和 .cs
我在 Mac OS 上使用 Mono/MonoDevelop,我想要一个使用 SqlMetal(Mono 附带的 DbLinq 版本)的示例,用于 LINQ-to-SQL 和 MySQL 数据库。 奇
我一直在试图弄清楚如何在 Windows 应用商店应用程序中为 ORM 数据库访问工作获得一个像样的 LINQ。 我发现的只是 SQLite 和 sqlite-net NuGet 包。后者有点糟糕,因
更新 - 答案显然是 DbLinq 没有实现 Dispose()适本地。哦! 以下内容具有误导性 - 底线:DbLinq(目前)还不等同于 LinqToSql,正如我最初问这个问题时所假设的那样。谨慎
我是一名优秀的程序员,十分优秀!