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

假设有两个表:Category 和 CategoryDe​​tail。类别包含 CategoryId (PK)、ParentId 和 TemplateId。CategoryDe​​tail 包含 CategoryId (FK)、LanguageId、标题和说明(以适当的语言),以及 CategoryId 和 LanguageId 的组合 PK。

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

该数据库在我的旧对象库(老式自定义 BOL 和 DAL)上运行良好,但我担心 LinqToSQL 需要对此进行更改才能为我提供所需的结果。

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

有帮助吗?

解决方案

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

其他提示

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

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

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

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

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

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top