3

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

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

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

这个数据库在我的旧对象库(一个老式的自定义 BOL 和 DAL)上运行良好,但我担心 LinqToSQL 需要更改它才能给我所需的结果。

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

4

4 回答 4

2

我不得不假设不能是真正的 1 对 1。听起来你在 Cat Details 表上有一个 CatID 和 Lang ID 的 PK。这可以解释为什么它要收藏。我可能是错的,因为你没有提到 CatDetails 表的 PK

编辑: CatID 和 Lang ID 的组合 Pk 构成 1:m 关系,而 Linq to SQL 实际上正在做正确的事情。它可能是真正的 1:1 的唯一方法是,如果您在 cat 表上也有一个 lang ID,并且这是 FK 的一部分。我觉得你可能不得不重新考虑你想做什么,或者你想如何实现它。

于 2008-09-30T09:41:35.853 回答
2

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

于 2008-09-30T09:45:15.907 回答
0

我认为 LINQ to SQL 直接对数据库结构进行建模。您有两个表,因此它创建了 2 个对象。

您是否看过 LINQ to Entities,这允许您在数据库结构之上创建另一层,以创建更具可读性的类。

于 2008-09-30T09:40:10.147 回答
0

由于您没有 1:1 的关系,因此仅映射将无法提供所需的功能。然而,很容易在父自动生成的类中提供一个方法来完成这项工作:

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}
于 2008-09-30T09:59:23.063 回答