今天我有一个实体框架问题。我有两个表:Projects和Projects\u Rights
alt text 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);
我已经找到了如何防止实体框架
<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>
我已经宣布了级联
在我的SQL Server和SSDL中。很好!
插入
是否将记录保存到项目权限表中?通过触发器/函数在那里添加记录。
谢谢你给我指明了正确的方向!
编辑:
我找到了另一种方法。谢谢亚历克斯帮我离开这条路。
我已经创建了一个视图
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
现在,我可以将此视图映射为实体框架中的“表”[Identity]和[Rights]映射为计算列。
另一个触发器现在负责填写正确的身份和权限。我还有一个问题。如果我在Projekte_Rights表中插入多行,EF声明一个实体返回了多行。但这是另一个故事,超出了这个问题的范围。