没有显式外键关系的Linq To SQL

问题描述 投票:14回答:7

我正在使用一些具有关系的遗留表,但这些关系尚未明确设置为主键/外键。我使用“Linq To Sql Classes”创建了一个.dbml文件,并建立了正确的Case.CaseID = CaseInfo.CaseID关联。我得到的类是CasesDataContext。

我的桌子(一对多):

Case
------------------
CaseID (int not null)
MetaColumn1 (varchar)
MetaColumn2 (varchar)
MetaColumn3 (varchar)
...


CaseInfo
------------------
CaseInfoID (int)
CaseID (int nulls allowed)
CaseInfoMeta (varchar)
...

我是LinqToSQL的新手,我很难做到......

CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            where c.CaseInfo.CaseInfoMeta == "some value"
            select c;

(编辑)我的问题是CaseInfo或CaseInfos不能作为Cases的成员。

我从一位同事那里听说我可能会尝试ADO.Net实体数据模型来创建我的数据上下文类,但还没有尝试过,想看看我是在浪费时间还是应该走另一条路。任何提示,链接,帮助将非常感激。

linq linq-to-sql class foreign-keys associations
7个回答
26
投票

返回设计器并检查关系是否设置正确。这是一个真实的例子,BillStateMasters有“CustomerMasters1”属性(该州的客户):alt text

PS。正在清理命名......

更新1:您还需要确保两个表都已定义主要。如果未在数据库上定义主键(并且无法以任何原因定义),请确保在设计器中定义它们。打开列的属性,并将其设置为主键。也就是说,如果您没有实体的主键,实体跟踪也将无法工作,对于删除意味着它实际上不会更新实体。因此,请务必检查所有实体并使用主键(如我所说,如果它不能在db上,那么在设计器上)。


5
投票
CasesDataContext db = new CasesDataContext();
var Cases = from c in db.Cases
            join ci in db.CaseInfo on
            ci.ID equals c.InfoID
            where ci.CaseInfoMeta == "some value"
            select new {CASE=c, INFO=ci};

我的“加入”linq有点生疏,但上面应该接近你所追求的。


0
投票

协会是一对一还是一对多?如果您将关联设置为One to Many,那么您拥有的是EntitySet,而不是EntityRef,您需要在依赖集上使用where子句来获取正确的值。我怀疑你想要一对一的关系,这不是默认的关系。尝试将其更改为一对一,看看是否可以构建查询。

注意:我只是猜测,因为你实际上没有告诉我们实际上是什么“麻烦”。


0
投票

您的查询看起来正确,应该返回Case对象的查询结果集。

所以有什么问题?

(编辑)我的问题是CaseInfo在案例下不可用...即c.CaseInfo不存在,我假设如果有明确的主/外键关系。

“不可用”是什么意思?如果您按照自己的意愿在设计器中创建了关联,那么查询应该生成SQL的内容

SELECT [columns] 
FROM Case INNER JOIN CaseInfo 
   ON Case.CaseID = CaseInfo.CaseID
WHERE CaseInfo.CaseInfoMeta = 'some value'

您是否调试了linq查询以获取生成的SQL?它返回了什么?


0
投票

您可能想要尝试的几件事:

检查关联的属性。确保将Parent属性创建为Public。它默认情况下会这样做,但可能会有所改变。

由于你没有在C上获得CaseInfo,尝试在另一个方向键入它以查看你是否获得了带有intellisense的ci.Case。

一起删除并重新创建关联。

如果孩子们没有出现,就会出现一些非常基本的错误。最好删除dbml并重新创建整个内容。

如果所有其他方法都失败了,请切换到NHibernate。 :)


0
投票

经过几次测试后,我非常确定数据库中是否需要FK关系,无论在Linq-to-SQL中创建了什么关联。即如果您没有在数据库中明确设置它们,则必须手动进行连接。


0
投票

这是c#?我认为你需要==而不是=这一行:

where c.CaseInfo.CaseInfoMeta = "some value"

应该读

where c.CaseInfo.CaseInfoMeta == "some value"
© www.soinside.com 2019 - 2024. All rights reserved.