在多对多关系中映射另一个表

本文关键字:另一个 映射 关系 | 更新日期: 2023-09-27 18:32:43

我正在处理一个C#项目,通过sqlmetal工具自动生成的类查询Sql Db。这工作正常。

我的问题是在我的数据库中,我必须具有many to many关系的表(表A表B(,因此,有一个名为TableATableB的第三个表,它仅保存表A表B的主键。

因此,正如预期的那样,我的实体模型有一个名为 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 的属性,它直接为我提供了所有相关 TableB 行的System.Data.EntitySet<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
        }
    }

提前谢谢。

在多对多关系中映射另一个表

Linq to SQL 不支持您想要的行为。L2S 不支持隐式多对多集合(如 EF(。

实体框架可以,但要求多对多表(在本例中为 TableATableB(的所有字段构成该表的主键。 例如,如果 TableA 的主键是 Id,而 TableB 的主键是 Id,则 TableATableB 必须正好有两个字段,即 TableA_Id 和 TableB_Id,它们是该表的主键。 如果 TableATableB 在本例中具有三个字段(如 Id、TableA_Id 和 TableB_Id(,并且 Id 是多对多表的主键,则 EF 不能也不会将其视为隐式多对多集合。