代码之家  ›  专栏  ›  技术社区  ›  Sean Amos

Linq 2 SQL,无法创建关联

  •  2
  • Sean Amos  · 技术社区  · 16 年前

    我正在处理一些遗留数据库,但基本思想如下:

    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之间的差异为空,所以它失败了。

    我能让这个协会运作吗,例如:

    item.Translations
    

    错误信息: 无法创建关联“项目翻译”。属性没有匹配的类型:“translationid”、“id”。

    我知道这与translationid可以为空有关,因为另一个与翻译关联的表可以正常工作,但是它的translationid列不是空的。

    翻译中的示例数据:

    Id Language Translation
    1  en-us    some text
    1  en-gb    some text
    2  en-us    some text
    2  en-gb    some text
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   Nick Larsen    16 年前

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

    一旦你得到处理,如果你有问题,请张贴你得到的错误信息。

    编辑:

    Linq2SQL不是用来识别您要做什么的。当您创建一个外键时,您可以用语言说,父级有许多子级。父表有主键,子表有指向该主键(外键)的指针。你是如何设置的,正好相反。在您的情况下,您链接的不是完整的主键,而是主键的一部分,它提供足够的信息来反转关系。

    我理解您的问题,需要从多个表链接翻译表,所以我通常会在这里建议重新设计。既然它看起来像是在做你想要的,我就把它留到另一条线上去。我的建议是在类中添加您自己的属性,并在设计器中删除关联。

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

    第二章

    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);
            }
        }
    }