与Linq To SQL定义一对一的关系

时间:2008-09-30 09:35:11

标签: linq-to-sql multilingual

我正在使用现有的多语言数据库来使用LinqToSQL,但我遇到了映射一个相当重要的一对一关系的问题,所以我怀疑我在数据库设计中错误地使用了该功能。

假设有两个表,Category和CategoryDe​​tail。类别包含CategoryId(PK),ParentId和TemplateId。 CategoryDe​​tail包含CategoryId(FK),LanguageId,Title和Description(使用适当的语言),其中包含CategoryId和LanguageId的组合PK。

如果我将这些表拖放到LinqToSQL设计器中,则生成的对象模型具有带有CategoryDe​​tail对象集合的Category,绝不应该是这种情况。我希望能够在DataContext级别过滤LanguageId,这意味着整个Category被封装在Category.CategoryDe​​tail中,而不是所有封装在Category.CategoryDe​​tails中的语言版本。

这个数据库在我的旧对象库(老式自定义BOL和DAL)上运行良好,但我担心LinqToSQL会要求更改以便为我提供所需的结果。

使这种关系(和语言过滤)尽可能无缝的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

我必须假设不能成为真正的1对1.听起来你在Cat详细信息表上有一个CatID和Lang ID的PK。这可以解释为什么要放一个系列。我没错,因为你没有提到CatDetails表的PK

编辑:CatID和Lang ID的组合Pk使得它与1:m的关系,而Linq to SQL实际上正在做正确的事情。它可能是真正的1:1的唯一方法是,如果你在猫桌上也有一个lang ID,那就是FK的一部分。我想你可能不得不重新思考你想做什么,或者你想如何实现它。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我认为LINQ to SQL直接为数据库结构建模。 你有两个表,所以它创建了2个对象。

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

答案 3 :(得分:0)

由于您没有1:1的关系,因此单独的映射不会提供所需的功能。但是,很容易在父自动生成的类中提供执行该任务的方法:

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