使用LinqToSQL定义一对一关系

3
我正在使用现有的多语言数据库玩转LinqToSQL,但是我在映射一个相当重要的一对一关系时遇到了问题,因此我怀疑我在我的数据库设计中错误地使用了该功能。 假设有两个表,Category和CategoryDetail。Category包含CategoryId(PK),ParentId和TemplateId。CategoryDetail包含CategoryId(FK),LanguageId,Title和Description(以适当的语言),其组合PK为CategoryId和LanguageId。 如果我将这些表拖放到LinqToSQL设计器中,生成的对象模型将具有一个包含CategoryDetail对象集合的Category,这永远都不应该是这种情况。我想能够在DataContext级别上过滤LanguageId,这意味着整个Category都封装在Category.CategoryDetail中,而不是所有语言版本都封装在Category.CategoryDetails中。 这个数据库在我的旧对象库(一个老派的自定义BOL和DAL)上运行良好,但我担心LinqToSQL需要改变这一点才能给我所需的结果。 使这种关系(和语言过滤)尽可能无缝的最佳方法是什么?
4个回答

2
我得假设这不是真正的一对一关系。听起来你在Cat Details表上有一个CatID和Lang ID的PK。这就解释了为什么它会生成一个集合。如果我错了,因为你没有提到CatDetails表的PK。编辑:CatID和Lang ID的组合主键使其成为1:m的关系,Linq to SQL实际上正在执行正确的操作。唯一可能是真正的1:1关系的方式是如果你在cat表上也有一个lang ID并且那是FK的一部分。我认为你可能需要重新考虑你想要做什么,或者你想要如何实现它。

抱歉,是的,我刚刚澄清了原始帖子的上下文 - 我确实有一个组合主键。是否有一种不同的数据库结构可以推断我想要一对一关系? - tags2k
我目前想不到任何东西,抱歉。你可以把这个加入你的帖子中,看看是否有其他人有一些想法。 - mattlant

2
您可以查看关联的属性(右键单击表示关联的线并显示属性)。属性将告诉您它是一对一还是一对多关系。这在代码中反映为具有单个实体关联(一对一)或实体集合关联(一对多)。

谢谢,我完全错过了这个选项!从技术上讲,这是答案,但是一旦我定义它,我就会得到一个“序列包含多个元素”的异常,这是真的。复制LanguageId将引入冗余,所以我认为现在是时候将XML Web服务连接到旧的数据库了! - tags2k
嘿,太好了,重要的是你得到了你需要的答案。 - mattlant

0

我认为LINQ to SQL直接对数据库结构进行建模。如果你有两个表,它就会创建2个对象。

你是否看过LINQ to Entities?它允许你在数据库结构之上创建另一层,以便创建更易读的类。


0

由于您没有1:1的关系,仅仅进行映射是无法提供所需功能的。但是,在父自动生成的类中提供一个执行此操作的方法非常容易:

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,