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

时间:2009-03-06 15:26:31

标签: linq linq-to-sql class foreign-keys associations

我正在使用一些具有关系的遗留表,但这些关系尚未明确设置为主键/外键。我使用“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 不能作为案例的成员。

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

7 个答案:

答案 0 :(得分:26)

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

聚苯乙烯。命名正在被清理......

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

答案 1 :(得分: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有点生疏,但上面应该接近你所追求的。

答案 2 :(得分:0)

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

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

答案 3 :(得分: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?它又回归了什么?

答案 4 :(得分:0)

您可能想尝试一些事情:

检查关联的属性。确保将Parent属性创建为Public。它默认情况下执行此操作,但可能已更改。

由于您没有在C上获取CaseInfo,请尝试在另一个方向键入它以查看是否使用intellisense获取ci.Case。

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

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

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

答案 5 :(得分:0)

这是c#吗?我认为你需要==代替=:

where c.CaseInfo.CaseInfoMeta = "some value"

应该阅读

where c.CaseInfo.CaseInfoMeta == "some value"

答案 6 :(得分:0)

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