使用 LinqToSQL 定义一对一关系
-
02-07-2019 - |
题
我正在使用现有的多语言数据库来使用 LinqToSQL,但在映射相当重要的一对一关系时遇到问题,因此我怀疑我在数据库设计中错误地使用了该功能。
假设有两个表:Category 和 CategoryDetail。类别包含 CategoryId (PK)、ParentId 和 TemplateId。CategoryDetail 包含 CategoryId (FK)、LanguageId、标题和说明(以适当的语言),以及 CategoryId 和 LanguageId 的组合 PK。
如果我将这些表拖放到 LinqToSQL 设计器中,生成的对象模型将具有带有 CategoryDetail 对象集合的 Category,而这种情况永远不应该出现。我希望能够在 DataContext 级别过滤 LanguageId,这意味着整个类别都封装在 Category.CategoryDetail 中,而不是所有语言版本都封装在 Category.CategoryDetails 中。
该数据库在我的旧对象库(老式自定义 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);
}
}