Linq to sql SQLMetal多个外键指向一个表问题

Linq to sql SQLMetal多个外键指向一个表问题,linq-to-sql,.net-4.0,sqlmetal,Linq To Sql,.net 4.0,Sqlmetal,编辑-清理问题以更好地反映实际问题: 我正在使用SQLMetal从SQL Server数据库生成数据库类。最近,我需要添加一个表,其中有多个外键指向同一个表。使用LINQPad处理新表,我可以访问两个外键的属性,如下所示: record.FK_AId 记录.FK_出价 record.FKA record.FKB …这正是我所期望的。问题是,SQLMetal生成的类产生以下属性: record.FK_AId 记录.FK_出价 record.FKA record.fkbTableNameGoe

编辑-清理问题以更好地反映实际问题:

我正在使用SQLMetal从SQL Server数据库生成数据库类。最近,我需要添加一个表,其中有多个外键指向同一个表。使用LINQPad处理新表,我可以访问两个外键的属性,如下所示:

  • record.FK_AId
  • 记录.FK_出价
  • record.FKA
  • record.FKB
…这正是我所期望的。问题是,SQLMetal生成的类产生以下属性:

  • record.FK_AId
  • 记录.FK_出价
  • record.FKA
  • record.fkbTableNameGoesher
现在我可以把生成的类存储起来,这样FKBTableNameGoesher就变成了FK_B,但是生成的文件经常被不同的团队成员更改,这将是一个巨大的痛苦。有没有简单的解决办法

提前谢谢

编辑2
因此,我认为解决方案是创建一个部分类,该类的属性名为我想要的属性,并让getter/setter指向名称不正确的属性。这对选择有用,但在where子句等中不使用它。任何人都有解决方案???

因此,我的解决方案是只添加另一个分部类,并添加一个get/set指向奇怪命名的FKBTableNameGoesher属性的属性。这样我们就不必不断修改生成的类。这并不能完全解决问题,但应该让开发商更清楚地产意味着什么。有人看到该解决方案存在任何潜在问题吗

编辑-显然,这只适用于选择数据,而不是基于数据进行过滤。不像我希望的那么容易解决。有人有其他建议吗

编辑2-Jeeze,认为这可能是一个常见问题,但我想不是。不管怎么说,结果证明我做这件事是对的。我发现这个帖子:

这让我想到,我不能直接链接到另一个属性的getter/setter,因为在幕后可能会发生更多的事情。这个家伙的解决方案并不是完全正确的答案,但它把我推向了正确的方向。添加关联属性是它的最终目的:

public partial class ProblemClass
{
    [Association(Name = "FK__SomeLinkHere", Storage = "_OriginalPoorlyNamedStorageVariable", ThisKey = "FK_1_Id", OtherKey = "Id", IsForeignKey = true)]
    public FKType MyNewBetterName
    {
        get
        {
            return this._OriginalPoorlyNamedStorageVariable.Entity;
        }

        set
        {
            this.OriginalPoorlyNamedStorageVariable = value;
        }
    }
}

任何人都可以想出一个更干净的解决方案,我将继续为他们提供奖励。

好的,我将提出一个新的答案(稍晚一点,对不起),即使协会的名称发生变化,这个答案仍然有效

此方法将查找主实体的关联属性,然后在主表中查找值。想象一下:

表:
Orders
引用表
Customers
by
Orders.CustomerID
等于
Customers.Id
。因此,我们传递主表的元信息,字段
CustomerID
(它是引用的字段)和字段
Name
(它是我们想要的值)

问题是,只能使用只有一个引用字段的外键。但是,更改为多个键非常简单

这是一个获取主表字段值的方法,可以更改为返回整个对象


PS:我想我在英语方面犯了一些错误,这对我来说相当困难。

这个问题很久以前就提出了,但我刚刚遇到了这个问题。我使用的是DBML,我通过编辑关系解决了这个问题。如果展开ParentProperty,可以通过更改name属性来设置属性名称

以下是来自DBML的XML(成员属性已更改):


以下是Ocelot20版本的一个变体:

public partial class ProblemClass
{
    partial void OnCreated()
    {
        this._MyNewBetterName = default(EntityRef<FKType>);
    }
    protected EntityRef<FKType> _MyNewBetterName;

    [Association(Name = "FK__SomeLinkHere", Storage = "_MyNewBetterName", ThisKey = "FK_1_Id", OtherKey = "Id", IsForeignKey = true)]
    public EntityRef<FKType> MyNewBetterName
    {
        get
        {
            return this._MyNewBetterName.Entity;
        }

        set
        {
            this.MyNewBetterName = value;
        }
    }
}
公共部分类ProblemClass
{
部分void OnCreated()
{
这是._mynewettername=default(EntityRef);
}
受保护的EntityRef_MyNewBetterName;
[关联(Name=“FK\uu SomeLinkHere”,Storage=“\u mynewettername”,ThisKey=“FK\u 1\u Id”,OtherKey=“Id”,IsForeignKey=true)]
公共实体引用MyNewBetterName
{
得到
{
返回此文件。\u mynewettername.Entity;
}
设置
{
this.MyNewBetterName=值;
}
}
}

有了它,您甚至不需要知道原始的存储名称,但是我不确定setter是否会工作(我只使用了getter,但它工作起来很有魅力)。您甚至可以将此关系定义打包到基类中,并使分部继承它(如果您需要跨多个模型\上下文重用此关系,这应该会更容易),但关键是,您必须在每个分部中定义
OnCreated()
,因为这些不能在c中继承().

这实际上可以更进一步,可以完全省略使用_OriginalPoorlyNamedStorageVariable。然而,我不确定在构造函数中不包含您自己的存储变量是否不会导致其他一些复杂情况,但我可能很快就会发现。。。
      AttributeMappingSource mapping = new System.Data.Linq.Mapping.AttributeMappingSource();
      MetaModel model = mapping.GetModel(typeof(WhateverClassesDataContext));
      MetaTable table = model.GetTable(typeof(Order));
      Object value = GetForeignValue(table, "CustomerId" /* In the main table */, "Name" /* In the master table */);
  <Association Name="State_StateAction1" Member="DestinationState" ThisKey="DestinationStateId" OtherKey="Id" Type="State" IsForeignKey="true" />
public partial class ProblemClass
{
    partial void OnCreated()
    {
        this._MyNewBetterName = default(EntityRef<FKType>);
    }
    protected EntityRef<FKType> _MyNewBetterName;

    [Association(Name = "FK__SomeLinkHere", Storage = "_MyNewBetterName", ThisKey = "FK_1_Id", OtherKey = "Id", IsForeignKey = true)]
    public EntityRef<FKType> MyNewBetterName
    {
        get
        {
            return this._MyNewBetterName.Entity;
        }

        set
        {
            this.MyNewBetterName = value;
        }
    }
}