2010-01-12 5 views
4

Aujourd'hui, j'ai une question Entity Framework. J'ai deux tableaux: Projets et Projects_RightsEntity Framework: mappage de plusieurs tables en une seule entité -Insert problèmes

alt text http://www.zaczek.net/EF-stackoverflow.jpg

  • Projets contient des projets ...
  • Project_Rights contient les droits d'accès pour chaque identité (= utilisateur) pour chaque projet. Cette table est calculée par des déclencheurs/fonctions.

Mapping tableau dans les une entité n'a pas été contestée:

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> 

Sélection des projets soit:

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

J'ai compris comment empêcher Entity Framework de mise à jour CurrentIdentity__Implementation __ (= Identité) & CurrentAccessRights__Implementation __ (= Right). Ceci est fait dans le SSDL en configurant 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> 

J'ai déclaré une cascade supprimer dans mon SQL Server et SSDL. Fonctionne très bien!

Mon problème est: Comment puis-je empêcher Entity Framework de d'insérer un enregistrement dans la table Project_Rights? L'ajout d'enregistrements est effectué par un déclencheur/une fonction.

Merci de m'avoir indiqué la bonne direction!

EDIT:

J'ai trouvé une autre façon. Merci à Alex de m'avoir aidé à quitter ce chemin.

J'ai créé un Voir

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 

Cette vue est actualisable. Pour pouvoir supprimer une ligne que je mis en œuvre ce déclencheur:

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 

Maintenant je peux mapper ce point de vue comme une « table » dans Entity Framework. [Identité] et [Droits] sont mappés en tant que colonnes calculées. Un autre déclencheur est maintenant chargé de remplir les identités et les droits corrects. Et ici j'ai un autre problème. Si j'insère plus d'une ligne dans la table Projekte_Rights, EF prétend qu'une entité a renvoyé plusieurs lignes. mais c'est une autre histoire et hors de portée de cette question.

Répondre

3

Si vous souhaitez plus de contrôle granulaire sur les insertions &, vous devez utiliser StoredProcedures pour les opérations d'insertion/mise à jour/suppression.

Malheureusement, la portée d'une mise à jour/insertion/suppression est l'entité, vous ne pouvez pas obtenir plus granulaire et configurer un Sproc (pour une table) et T-SQL standard (pour l'autre table).

Cela signifie que si vous devez remplacer le contrôle de la table Projekt_Rights, vous devez également le faire pour la table Projekt.

Consultez this sample pour en savoir plus.

Remarque: si vous devez le faire pour l'insertion, vous devez malheureusement le faire aussi pour la mise à jour et la suppression.

Hope this helps

Alex

+0

+1: J'avais peur d'entendre ça. Merci de m'avoir aidé à partir de cette façon. Je vais essayer une solution avec des vues actualisables. – Arthur

Questions connexes