2010-01-12 146 views
4

今天我有一個實體框架問題。我有兩個表:項目和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聲稱一個實體返回多個行。但這是另一個故事,超出了這個問題的範圍。

回答

3

如果您想要更精細地控制插入&更新,您需要使用StoredProcedures進行插入/更新/刪除操作。

不幸的是,更新/插入/刪除的範圍是實體,無法獲得更精細的配置Sproc(對於一個表)和標準T-SQL(對於其他表)。

這意味着如果您需要重寫Projekt_Rights表的控制權,您還必須爲Projekt表執行該控制。

查看更多this sample

注意:如果你需要這樣做插入,不幸的是你必須做更新和刪除。

希望這有助於

亞歷

+0

+1:我害怕聽到這個消息。謝謝你幫助我離開這個方向。我將嘗試使用可更新視圖的解決方案。 – Arthur 2010-01-13 09:15:56