Сегодня у меня есть вопрос об 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, то заявит, что сущность вернула более одной строки. но это другая история и выходит за рамки этого вопроса.