我们有一个数据库表,用于存储一些wave文件和相关元数据的位置。表中有一个外键(employeeid),链接到员工表。然而并非所有的wav文件都与雇员有关,因为这些记录employeeid为空。我们使用LinqToSQl访问数据库,查询到退出时,所有非员工相关的wav文件记录如下:有趣的LinqToSql行为
var results = from Wavs in db.WaveFiles
where Wavs.employeeid == null;
除了这不返回任何记录,尽管有记录,其中雇员为空。谱上的SQL Server我发现没有记录返回的原因是因为LinqToSQl是将其转化为SQL,看起来非常像:
SELECT Field1, Field2 //etc
FROM WaveFiles
WHERE 1=0
显然,这不返回行。但是,如果我进入DBML设计器并删除关联并保存。突然之间LINQ查询完全相同变成
SELECT Field1, Field2 //etc
FROM WaveFiles
WHERE EmployeeID IS NULL
即:如果存在关联,则LinqToSql将假定所有记录都具有外键值(即使它可为空,并且该属性在WaveFile实体中显示为可为空的int),并因此可构造一个将不返回记录的where子句。
有谁知道是否有办法保持LinqToSQL中的关联,但停止这种行为。我能够迅速想到的解决方法是有一个名为IsSystemFile的计算字段,如果employeeid为空,则将其设置为1,否则将其设置为0。然而,这似乎有点破解LinqToSQl的奇怪行为,我宁愿在DBML文件中做一些事情,或者在外键约束上定义一些可以防止这种行为的东西。