English 中文(简体)
没有明确的外键关系的Linq To SQL
原标题:
  • 时间:2009-03-06 15:26:31
  •  标签:

我正在使用一些具有关系的遗留表进行工作,但是这些关系尚未明确设置为主键/外键。我使用“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;

(Edit) My problem being that CaseInfo or CaseInfos is not available as a member of Cases.

我从同事那听说可以尝试使用ADO.Net实体数据模型来创建我的数据上下文类,但我还没有尝试过,想知道是否浪费时间,是否应该选择其他路径。如果您有任何提示、链接或帮助,将不胜感激。

最佳回答

Go back to the designer and check the relation is set up correctly. Here is one real life example, with BillStateMasters have "CustomerMasters1" property (customers for the state): alt text

Ps. 命名正在被清理中...

更新1:你还需要确保两个表都有一个主键定义。如果主键在数据库中没有定义(或由于任何原因无法定义),请务必在设计器中定义它们。打开列的属性,将其设置为主键。话虽如此,如果实体没有主键,实体跟踪也将无法工作,这意味着在删除时它不会静默更新实体。因此,请确保审查所有实体并确保它们都有一个主键(如我所说,如果它不能在数据库中定义,则在设计器中)。

问题回答
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};

我的“join”语句有点生疏,但以上内容应该接近您所需的。

这个关联是一对一还是一对多关系?如果你的关联是一对多关系,那么你所拥有的是一个实体集,而不是实体引用,你需要在从属集上使用where子句来获取正确的值。我猜你想要的是一个一对一的关系,这不是默认设置。试着把它改成一对一,看看你能否构建查询。

注意:我只是在猜测,因为您实际上没有告诉我们困扰是什么。

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

那么... 问题是什么?

(Edit) My problem being that CaseInfo is not available under Cases... i.e. c.CaseInfo doesn t exist where I m assuming it would be if there were explicit primary/foreign key relationships.

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

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

您调试了LINQ查询以获取生成的SQL吗?它返回什么?

你可能想尝试的一些事情:

检查关联的属性。确保Parent属性已经创建为公共。通常情况下默认已经为公共属性,但可能有所更改。

因为你在C上没有得到CaseInfo,请尝试将其输入另一个方向,看看是否能通过智能感知获得ci.Case。

删除并全部重新创建关联。

如果子成员没有出现,这意味着出了很基本的问题。最好的方法是删除dbml并重新创建整个数据库。

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

经过几次测试,我相当确定 FK 关系在数据库中是必需的,无论在 Linq-to-SQL 中创建了什么样的关联。也就是说,如果您没有在数据库中明确设置它们,那么您将不得不手动执行联接操作。

这是C#吗?我想你需要在这一行使用==而不是=。

where c.CaseInfo.CaseInfoMeta = "some value"

应该阅读

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




相关问题
热门标签