15

我正在处理一些具有关系的旧表,但这些关系尚未明确设置为主键/外键。我使用“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 实体数据模型来创建我的数据上下文类,但还没有尝试过,想看看我是否会浪费我的时间,或者我应该走另一条路。任何提示、链接、帮助将不胜感激。

4

7 回答 7

26

返回设计器并检查关系是否设置正确。这是一个现实生活中的示例,BillStateMasters 具有“CustomerMasters1”属性(该州的客户): 替代文字

附言。正在清理命名...

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

于 2009-03-06T23:15:06.670 回答
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 有点生疏,但上面应该接近你所追求的。

于 2009-03-09T21:35:13.437 回答
0

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

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

于 2009-03-06T15:33:20.523 回答
0

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

所以有什么问题?

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

“不可用”是什么意思?如果您按照您所说的那样在设计器中创建了关联,那么查询应该生成类似于以下内容的 SQL

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

你调试过你的 linq 查询来生成 SQL 了吗?它返回什么?

于 2009-03-06T15:36:02.733 回答
0

您可能想尝试几件事:

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

由于您没有在 C 上获得 CaseInfo,请尝试从另一个方向输入它以查看您是否获得带有智能感知的 ci.Case。

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

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

如果一切都失败了,请切换到 NHibernate。:)

于 2009-03-06T18:01:35.707 回答
0

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

where c.CaseInfo.CaseInfoMeta = "some value"

应该读

where c.CaseInfo.CaseInfoMeta == "some value"
于 2009-03-06T18:51:39.830 回答
0

经过几次测试,我很确定无论在 Linq-to-SQL 中创建什么关联,数据库中都需要 FK 关系。即,如果您没有在数据库中明确设置它们,那么您将不得不手动进行连接。

于 2009-03-10T19:36:21.357 回答