LINQ中的多对多映射实体

时间:2011-12-02 16:20:35

标签: linq linq-to-sql c#-4.0 many-to-many

我有SQL Server表,如下所示:

create table TableA (
id int primary key identity,
name varchar(16) not null
)
create table TableB (
id int primary key identity,
data varchar(max) not null
)
create table TableAtoB (
tablea_id int not null foreign key references TableA(id),
tableb_id int not null foreign key references TableB(id),
primary key nonclustered (tablea_id, tableb_id)
)
create unique index idxID on TableAtoB(tableb_id, tablea_id)

和C#中的映射如下:

[Table]
public class TableA
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public int ID { get; set; }
    [Column]
    public string name { get; set; }
}

[Table]
public class TableB
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public int ID { get; set; }
    [Column]
    public string data { get; set; }
}

[Table]
public class TableAtoB
{
    [Column]
    public int tablea_id { get; set; }
    internal EntityRef<TableA> _tablea;
    [Association(IsForeignKey = true, OtherKey = "ID", ThisKey = "tablea_id", Storage = "_tablea")]
    public TableA tablea
    {
        get { return _tablea.Entity; }
        internal set { _tablea.Entity = value; }
    }
    [Column]
    public int tableb_id { get; set; }
    internal EntityRef<TableB> _tableb;
    [Association(IsForeignKey = true, OtherKey = "ID", ThisKey = "tableb_id", Storage = "_tableb")]
    public TableB tableb
    {
        get { return _tableb.Entity; }
        internal set { _tableb.Entity = value; }
    }
}

但是,我得到 System.InvalidOperationException:成员'TableAtoB.tablea'的无效关联映射。 'TableAtoB'不是实体。我的实体映射不正确吗?

我无法更改表架构。

2 个答案:

答案 0 :(得分:3)

您需要具有ColumnAttribute.IsPrimaryKey属性:

[Column(IsPrimaryKey = true)]
public int tablea_id { get; set; }
...
[Column(IsPrimaryKey = true)]
public int tableb_id { get; set; }

答案 1 :(得分:0)

您可能希望尝试使用设计器自动生成表格并查看生成的内容。 EntityRef有一些额外的构造函数和事件侦听器,您似乎缺少它们。此外,您可以在设计师中看到,您的两个结束表都没有典型的多对多表格参考。

此外,您可能希望查看PLINQO http://www.codesmithtools.com/plinqo中的实现,因为它们能够实现隐藏中间(TableAtoB)表的代码生成方法,并提供更类似于面向对象的代码吐出EF如何处理多对多关系。