Отображение сущностей «многие ко многим» в LINQ - PullRequest
1 голос
/ 02 декабря 2011

У меня есть таблицы 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 ]

3 голосов
/ 03 декабря 2011

Вам необходимо иметь свойство ColumnAttribute.IsPrimaryKey:

[Column(IsPrimaryKey = true)]
public int tablea_id { get; set; }
...
[Column(IsPrimaryKey = true)]
public int tableb_id { get; set; }
0 голосов
/ 02 декабря 2011

Вы можете попробовать автоматически сгенерировать таблицы с помощью конструктора и посмотреть, что сгенерировано. Есть некоторые дополнительные конструкторы и прослушиватели событий для EntityRef, которые, как вам кажется, отсутствуют. Кроме того, похоже, что ни одна из ваших конечных таблиц не имеет типичной ссылки на таблицу «многие ко многим», как вы найдете в дизайнерах.

Кроме того, вы можете взглянуть на реализацию в PLINQO http://www.codesmithtools.com/plinqo, поскольку они смогли реализовать сгенерированный кодом метод сокрытия средней таблицы (TableAtoB) и получить более объектно-ориентированный код, похожий на код. как EF обрабатывает отношения «многие ко многим».

...