Entity Framework Code Первый составной ключ сопоставления в таблице соединений, где внешние ключи не представлены в модели - PullRequest
0 голосов
/ 30 января 2012

У меня есть таблица соединения с дополнительным полем, относящимся к соединению:

VirtualDatastreamId  INT  NOT NULL
DatastreamId         INT  NOT NULL
FormulaElement       INT  NOT NULL

Все столбцы являются первичными ключами.

POCO, с которым он сопоставлен:

public class VirtualDatastreamMap 
{
    public virtual Datastream Datastream { get; set; }
    public virtual VirtualDatastream VirtualDatastream { get; set; }
    public virtual string FormulaElement { get; set; }
}

У меня нет свойств внешнего ключа в модели, так как для меня концепция внешнего ключа является деталью реализации и должна быть инкапсулирована отношениями, определенными классом. Я бы предпочел не добавлять их, если это возможно.

Как мне сопоставить это с Fluent API? Я надеялся на что-то вроде ниже (что, к сожалению, не работает):

modelBuilder.Entity<VirtualDatastreamMap>()
            .HasKey(vdm => 
                new 
                { 
                    DatastreamId = vdm.Datastream.Id, 
                    VirtualDatastreamId = vdm.VirtualDatastream.Id, 
                    FormulaElement = vdm.FormulaElement 
                });

Имена полей анонимного типа должны быть названы, поскольку объект не может иметь два поля с одинаковыми именами.

Я вижу из этого вопроса , что эта проблема была поднята в ответе, но, похоже, дальше ничего не происходит.

Если это невозможно, какой вариант лучше?

  1. Добавление свойств внешнего ключа в модель
  2. Добавить поле Id в базу данных и модель

Спасибо

1 Ответ

1 голос
/ 30 января 2012

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

В варианте 2 вам также потребуется создать уникальный ключ и проверить наличие нарушений уникального ключа.EF не имеет встроенной поддержки уникальных ключей.Следовательно, я бы выбрал вариант 1.

...