Linq to sql Linq 2 SQL,无法创建关联
我使用的是一些遗留数据库,但基本思想如下:Linq to sql Linq 2 SQL,无法创建关联,linq-to-sql,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中
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中创建关联,但是由于translationID和Translation表中的PK之间存在NULL差异,因此它失败了
我是否有办法让这个协会运作,例如:
item.Translations
错误消息:
无法创建关联“项目翻译”。属性没有匹配的类型:“TranslationId”、“Id”
我知道这与TranslationId为NULL有关,因为另一个与Translations关联的表可以正常工作,但是它的TranslationId列不是NULL
翻译中的示例数据:
Id Language Translation
1 en-us some text
1 en-gb some text
2 en-us some text
2 en-gb some text
目前,您已经进行了此设置,以便一个翻译可以包含多个项目,而不是您声明一个项目可以包含多个翻译的方式。要解决这个问题,您需要在
Translation
表中添加itemId
,并从Item
表中删除translationId
一旦你得到处理,如果你有问题,请张贴你得到的错误消息
编辑:
LINQ2SQL不是为了识别您正在尝试做什么而构建的。创建外键时,可以用文字表示,父项有多个子项。父表具有主键,子表具有指向该主键(外键)的指针。你是如何设置这是相反的。在您的情况下,您链接的不是完整的主键,而是主键的一部分,它提供了足够的信息来反转关系
我理解您需要从多个表链接translations表的问题,因此我通常主张在这里进行重新设计。因为它似乎做什么,你正在寻找,我会保存另一个线程。我的建议是将您自己的属性添加到类中,并删除设计器中的关联
您可以在设计器中的任意位置单击鼠标右键并选择“查看代码”,然后手动添加属性:
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);
}
}
}
名称空间MyNamespace
{
//将using语句放入此文件的命名空间中!!!
部分类项目
{
公开易读翻译
{
MyDataContext dc=新的MyDataContext();
返回dc.Translations.Where(t=>t.Id==this.translationId);
}
}
}
对不起,我在原来的帖子中犯了一个错误,翻译表的Id和语言都是PKs。此外,多个表引用此表进行翻译。但由于空差异,关联失败是没有意义的。外键允许为null,这只是意味着该项没有翻译。您能发布您收到的确切错误消息吗?我必须指出,如果只有唯一的值Translation.Id
而不是完整的主键就足够了,那么它也没有意义。数据库上的外键将无法直接链接到Id,您还必须包含该语言。不过,我不确定这是否与LINQ2SQL问题有关。准确的错误信息将大有帮助。