我正在使用现有的多语言数据库来使用LinqToSQL,但我遇到了映射一个相当重要的一对一关系的问题,所以我怀疑我在数据库设计中错误地使用了该功能。
假设有两个表,Category和CategoryDetail。类别包含CategoryId(PK),ParentId和TemplateId。 CategoryDetail包含CategoryId(FK),LanguageId,Title和Description(使用适当的语言),其中包含CategoryId和LanguageId的组合PK。
如果我将这些表拖放到LinqToSQL设计器中,则生成的对象模型具有带有CategoryDetail对象集合的Category,绝不应该是这种情况。我希望能够在DataContext级别过滤LanguageId,这意味着整个Category被封装在Category.CategoryDetail中,而不是所有封装在Category.CategoryDetails中的语言版本。
这个数据库在我的旧对象库(老式自定义BOL和DAL)上运行良好,但我担心LinqToSQL会要求更改以便为我提供所需的结果。
使这种关系(和语言过滤)尽可能无缝的最佳方法是什么?
答案 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);
}
}