今天我有一個實體框架問題。我有兩個表:項目和Projects_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);
我從更新想出如何防止實體框架CurrentIdentity__Implementation __(= Identity)& CurrentAccessRights__Implementation __(= Right)。這是通過設置StoreGeneratedPattern =「Computed」在SSDL中完成的。
<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刪除。很棒!
我的問題是:如何防止實體框架從插入記錄到Project_Rights表中?添加記錄是通過觸發器/函數完成的。
感謝您指點我正確的方向!
編輯:
我找到了另一種方式。感謝Alex幫助我離開這條道路。
我創建了一個查看
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
現在我可以映射這個觀點在實體框架「表」。 [身份]和[權利]被映射爲計算列。
另一個觸發器現在負責填寫正確的身份和權利。在這裏,我有另一個問題。如果我在Projekte_Rights表中插入多於一行的信息,EF聲稱一個實體返回多個行。但這是另一個故事,超出了這個問題的範圍。
+1:我害怕聽到這個消息。謝謝你幫助我離開這個方向。我將嘗試使用可更新視圖的解決方案。 – Arthur 2010-01-13 09:15:56