2013-07-10 67 views
3

我有一个名为tblOvrdImpVolsType的表,其中有两个可为空的外键列。我在使用Linq-To-SQL删除此表中的一行时,如果此行中的某个外键列为null。这里是我的代码:如何使用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有两个空,外键列(键1和键2)

  • 我感兴趣的行具有这些键值(键1 = 9898,键2 = 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以获得空值,则删除将会起作用。我不知道该怎么做。我也假设这个问题之前已经被问过了,但我找不到它。

编辑:我原来叫我的钥匙“主”而不是“外国”。我打算说“外国人”。我编辑我的帖子来代替“外国人”。我仍然有同样的问题。

+3

据我所知,SQL Server不**不允许任何**的列主键可以为空。不知道你是如何设法启动并运行的 - 我认为它基本上不应该可行...... –

+0

你能为表格生成一个脚本,所以我们可以看到你的意思是“可空主键”吗? –

+0

更不用说完全疯狂尝试。 –

回答

0

要确保你也搭上空值,你可以修改您的查询,看起来像这样:

select * FROM [tblOvrdImpVols] 
WHERE ([key1] = @p0) AND 
([key2] = @p1 OR 
    ([key2] is null and @p1 is null))