我正在使用一些遗留数据库,但这是基本的想法:
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
答案 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);
}
}
}