0

我正在开发一个通过该工具自动生成的类C#查询 a 的项目。这很好用。Sql Dbsqlmetal

我的问题是,在我的数据库中,我必须拥有具有关系的表(TableATableBmany to many,因此,还有第三个名为TableATableB的表,它只包含TableATableB的主键。

因此,正如预期的那样,我的 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的属性,它直接为我提供了所有相关TableBSystem.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
        }
    }

提前致谢。

4

1 回答 1

1

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

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

于 2013-09-25T15:34:33.273 回答