以多对多的关系映射另一个表

时间:2013-09-25 15:16:09

标签: c# linq-to-sql mapping

我正在开展一个C#项目,通过Sql Db工具通过自动生成的类查询sqlmetal。这很好。

我的问题是,在我的数据库中,我必须有表{(em> TableA 和 TableB ),这些表有many to many的关系,因此,有第三个表名为 TableATableB ,仅包含 TableA TableB 的主键。

因此,正如预期的那样,我的EntityModel有一个名为 TableA 的类,它有一个名为 TableATableB 的属性,它是所有相关 TableATableB 的集合。行。

这是自动生成的属性:

    [global::System.Data.Linq.Mapping.AssociationAttribute(Name="FK_TableATableB_TableA", Storage="_TableATableB", ThisKey="Id", OtherKey="TableAId", DeleteRule="CASCADE")]
    public EntitySet<TableATableB> TableATableB
    {
        get
        {
            return this._TableATableB;
        }
        set
        {
            this._TableATableB.Assign(value);
        }
    }

事情是我希望 TableA 拥有一个名为 TableB 的属性,它直接为我提供了所有相关System.Data.EntitySet<TableB>集合TableB 行,有没有办法做到这一点?我一直试图这样做,但我还没有找到映射它的方法。

为了澄清,我知道解决方法可能如下,但我想看看是否有更好的方法。此外,这样我怎么知道何时将 TableB 对象添加到集合中以添加相应的TableATableB对象?

partial class TableA
{
    public List<TableB> TableB
    {
        get
        {
            List<TableB> tableBRows = new List<TableB>();

            foreach (TableATableB tAtB in this.TableATableB)
            {
                tableBRows.Add(tAtB.TableB);
            }
            return tableBRows;
        }
        set
        {
            // What to do here?
            // I need to know when an element is added in order to add its respective
            // TableATableB object
        }
    }

提前致谢。

1 个答案:

答案 0 :(得分:1)

Linq to SQL不支持您想要的行为。 L2S不支持隐含的多个集合,如EF。

实体框架确实如此,但要求多个表的所有字段(在您的情况下为TableATableB)构成该表的主键。例如,如果TableA的主键是Id而TableB的主键是Id,那么TableATableB必须恰好有两个字段TableA_Id和TableB_Id,它们是该表的主键。如果TableATableB在这种情况下有三个字段,如Id,TableA_Id和TableB_Id,并且Id是许多表的主键,则EF不能也不会将其视为隐式多数集合。