Entity Framework: сопоставление нескольких таблиц в одну проблему Entity -Insert - PullRequest
4 голосов
/ 12 января 2010

Сегодня у меня есть вопрос об Entity Framework. У меня есть две таблицы: Projects и Projects_Rights

альтернативный текст http://www.zaczek.net/EF-stackoverflow.jpg

  • Проекты содержат несколько проектов ...
  • Project_Rights содержит права доступа для каждого удостоверения (= пользователя) для каждого проекта. Эта таблица вычисляется с помощью триггеров / функций.

Отображение этих таблиц в одну сущность не было проблемой:

class Project
{
    int ID;
    double AufwandGes;
    DateTime CreatedOn;
    ...
    int CurrentIdentity__Implementation__;
    int CurrentAccessRights__Implementation__;
}

<EntitySetMapping Name="Projekt">
  <EntityTypeMapping TypeName="IsTypeOf(Model.Projekt)">
    <MappingFragment StoreEntitySet="Projekt">
      <ScalarProperty Name="ID" ColumnName="ID" />
      <ScalarProperty Name="AufwandGes" ColumnName="AufwandGes" />
      <ScalarProperty Name="ChangedOn" ColumnName="ChangedOn" />
      <ScalarProperty Name="CreatedOn" ColumnName="CreatedOn" />
      <ScalarProperty Name="Kundenname" ColumnName="Kundenname" />
      <ScalarProperty Name="Name" ColumnName="Name" />
    </MappingFragment>
    <MappingFragment StoreEntitySet="Projekt_Rights">
      <ScalarProperty Name="ID" ColumnName="ID" />
      <ScalarProperty Name="CurrentIdentity__Implementation__" ColumnName="Identity" />
      <ScalarProperty Name="CurrentAccessRights__Implementation__" ColumnName="Right" />
    </MappingFragment>
  </EntityTypeMapping>
</EntitySetMapping>

Выбор проектов либо:

var prjList = ctx.GetQuery<Project>()
    // This condition is added automatically by a custom Linq Provider
    .Where(p => p.CurrentIdentity__Implementation__ == Thread.CurrentPrincipal.Identity.ID); 

Я выяснил, как запретить Entity Framework обновить CurrentIdentity__Implementation __ (= Identity) & CurrentAccessRights__Implementation __ (= Right) Это делается в SSDL путем установки StoreGeneratedPattern = "Computed".

  <EntityType Name="Projekte_Rights">
    <Key>
      <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="int" Nullable="false" />
    <Property Name="Identity" Type="int" Nullable="false" StoreGeneratedPattern="Computed" />
    <Property Name="Right" Type="int" Nullable="false" StoreGeneratedPattern="Computed" />
  </EntityType>

Я объявил каскад delete в моем SQL Server и SSDL. Прекрасно работает!

Моя проблема: Как я могу предотвратить Entity Framework от вставки записи в таблицу Project_Rights? Добавление записей выполняется триггером / функцией.

Спасибо, что указали мне правильное направление!

РЕДАКТИРОВАТЬ:

Я нашел другой способ. Спасибо Алексу за то, что он помог мне покинуть этот путь.

Я создал представление

create view Projekte_with_Rights as
select tbl.*, r.[Identity], r.[Right]
from Projekte tbl
inner join Projekte_Rights r on tbl.ID = r.id

Этот вид является обновляемым. Чтобы иметь возможность удалить строку, я реализовал этот триггер:

create trigger Projekte_with_Rights_DeleteTrigger
ON Projekte_with_Rights
INSTEAD OF DELETE AS
BEGIN
    DELETE FROM Projekte WHERE ID in (SELECT ID FROM deleted)
END

Теперь я могу отобразить это представление как «таблицу» в Entity Framework. [Личность] и [Права] отображаются как вычисляемые столбцы.

Другой Триггер теперь отвечает за заполнение правильных Идентификационных данных и Прав. И здесь у меня есть другая проблема. Если я вставлю более одной строки в EF таблицы Projekte_Rights, то заявит, что сущность вернула более одной строки. но это другая история и выходит за рамки этого вопроса.

1 Ответ

3 голосов
/ 13 января 2010

Если вы хотите более детальный контроль над вставками и обновлениями, вам нужно использовать StoredProcedures для операций вставки / обновления / удаления.

К сожалению, область обновления / вставки / удаления - это сущность, вы не можете получить более детальную информацию и настроить Sproc (для одной таблицы) и стандартный T-SQL (для другой таблицы).

Это означает, что если вам нужно переопределить управление для таблицы Projekt_Rights, вам нужно сделать это и для таблицы Projekt.

Проверьте этот образец для более.

Примечание: если вам нужно сделать это для вставки, к сожалению, вы должны сделать это и для обновления, и для удаления.

Надеюсь, это поможет

Alex

...