我有一个名为tblOvrdImpVolsType
的表,其中有两个外键列都可以为空。当这一行中的一个外键列为空时,我使用Linq-To-SQL删除此表中的一行时遇到了问题。以下是我的代码:
using (Databases.Global db = new Databases.Global())
{
db.Log = Console.Out;
var records = from iv in db.tblOvrdImpVolsType
join sm in db.tblSecurityMasterType
on iv.FkSecurity equals sm.PkSecurity
where sm.Name == name
select iv; //returns only 1 record
db.tblOvrdImpVolsType.DeleteAllOnSubmit<MyTableType>(records);
int numDeletes = db.GetChangeSet().Deletes.Count; // = 1
db.SubmitChanges(); //deletes 0 records
}
Databases.Global继承自DataContext并包含我使用的表。
tblOvrdImpVolsType有两个可空的外键列(key1和key2)
我关心的行具有这些关键值(key1=9898,key2=null)
在我的C#代码中,key1和key2的数据类型都是
int?
和CanBeNull=true
GetChangeSet()
显示将删除一条记录,但当我检查数据库时,该行显然未被删除。不会抛出任何异常。
以下是DataContext生成的SQL:
DELETE FROM [tblOvrdImpVols] WHERE ([key1] = @p0) AND ([key2] = @p1)
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [9898]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [Null]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.17929
我认为问题在于[key2] = @p1
这一部分。因为我关心的key2值为null,所以SQL查询出现了问题。以下SQL查询说明了这一点。唯一的区别是key2
条件中的is
和=
:
select * FROM [tblOvrdImpVols] WHERE ([key1] = 9898) AND ([key2] is null)
--returns 1 row
select * FROM [tblOvrdImpVols] WHERE ([key1] = 9898) AND ([key2] = null)
--returns 0 rows
我假设,如果我能让 DataContext 对象将
=
替换为 is
以处理 null 值,删除操作就会成功。但我不知道如何实现。我认为这个问题以前已经被问过,但我找不到相关信息。编辑:我最初将我的键称为“主键”,而非“外键”。我本意是说“外键”。我已经编辑了我的帖子,用“外键”代替了“主键”。但我仍然遇到同样的问题。
key1
和key2
都是外键,而不是主键。这是我的错误。 - user2023861Key1
和Key2
都没有标记为IsPrimaryKey
属性。这不是关于数据库模型的问题,而是关于在其中一个列为空时删除行的问题。 - user2023861