Linq 2 SQL,无法创建关联

时间:2010-07-08 14:10:53

标签: linq-to-sql

我正在使用一些遗留数据库,但这是基本的想法:

Item
Id INT PK NOT NULL
Description VARCHAR(50) NOT NULL
TranslationId INT NULLABLE

Translation
Id INT PK NOT NULL
Language VARCHAR(10) PK NOT NULL
Translation VARCHAR(50) NOT NULL

基本上每个项目可能有很多翻译,看起来很简单。这些表没有外键,所以我手动尝试在DBML中创建关联,但由于translateID和Translation表中的PK之间存在NULL差异,因此失败了。

无论如何,我可以让这种关联起作用,例如:

item.Translations

错误讯息: 无法创建关联“Item_Translation”。属性没有匹配类型:“TranslationId”,“Id”。

我知道它与可以为空的TranslationId有关,因为另一个与Translations关联的另一个表可以正常工作,但是它的TranslationId列是NOT NULL。

翻译的示例数据:

Id Language Translation
1  en-us    some text
1  en-gb    some text
2  en-us    some text
2  en-gb    some text

1 个答案:

答案 0 :(得分:2)

目前您已进行此设置,以便翻译可以包含多个项目,而不是您说明项目可以包含多个翻译的方式。要解决此问题,您需要在itemId表中添加Translation,并从translationId表中删除Item

如果您有问题,如果遇到问题,请发布您收到的错误消息。

编辑:

LINQ 2 SQL不是为了识别您要执行的操作而构建的。当您创建外键时,您可以用文字说出,父母有很多孩子。父级具有主键,子表具有指向该主键(外键)的指针。你如何设置它是相反的。在您的情况下,您不是链接完整的主键,而是链接主键的一部分,它提供足够的信息来反转关系。

我理解你需要从多个表链接翻译表的问题,所以我通常会争论在这里进行重新设计。既然它似乎正在寻找你想要的东西,我将把它保存为另一个线程。我的建议是将自己的属性添加到类中,并删除设计器中的关联。

您可以右键单击设计器中的任意位置并选择“查看代码”,然后只需手动添加属性:

namespace MyNamespace
{
    // put your using statements inside the namespace for this file!!!

    partial class Item
    {
        public IQueryable<Translation> Translations
        {
            MyDataContext dc = new MyDataContext();
            return dc.Translations.Where(t => t.Id == this.translationId);
        }
    }
}