2009-12-22 5 views
7

J'ai 2 tables, Table1 a une clé primaire 'CustomizationId', et Table2 a un FK Customizationid qui correspond à cela. La table2 n'a pas de clé primaire. J'essaie d'ajouter un nouvel enregistrement à partir d'un formulaire basé sur le Web. Je tente de sauver ce à la base de données et je reçois une erreur:Comment mettre à jour une table avec une clé étrangère vers une autre table dans ADO.Net Entity Model?

  Customization customization = new Customization(); 
      Code code = new Code(); 
      customization.Name = CustomizationName.Text;    
      customization.LastUpdated = DateTime.Now; 

      code.Top = top_js.InnerText; 
      code.Bottom = bottom_js.InnerText; 

      //code.CustomizationId = customization.CustomizationId; 

      customization.Code = code;    
      entities.AddToCustomizations(customization); 
      entities.SaveChanges(); 

Quand j'appelle SaveChanges que je reçois une erreur, si j'ajouter ou non dans la ligne commentée.

Unable to update the EntitySet 'Code' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation. 

Comment gérer cette situation? Je veux juste ajouter dans le code en même temps que j'ajoute dans la personnalisation. La table 'Code' doit avoir l'ensemble Customizationid défini sur PK/Identity défini par Customization.

Des idées?

Répondre

7

En ce qui concerne l'EF, la table sans PK est une vue.

Cela signifie que vous avez deux options:

  1. dire un peu mensonge blanc, et convaincre les EF que le 'view' is a table
  2. Add modification functions (Insérer/Mise à jour/Supprimer) afin que vous puissiez les modifier.

En général, les fonctions de modification sont des procédures stockées, mais vous pouvez réellement ajouter T-SQL directement à l'SSDL si vous n'avez pas accès à la base de données ...

à savoir quelque chose comme cela dans l'élément <StorageModel> du EDMX pour chaque action (insérer, mettre à jour et supprimer):

<Function Name="InsertCode" BuiltIn="false" IsComposable="false" > 
     <CommandText> 
       INSERT dbo.TCode(ID, Name) VALUES (@ID, @Name) 
     </CommandText> 
     <Parameter Name="ID" Type="int" Mode="In" /> 
     <Parameter Name="ID" Type="nvarchar(max)" Mode="In" /> 
</Function> 

Une fois que vous avez les fonctions de modification de votre SSDL vous devez map them de sorte que l'EF les utilise selon les besoins.

Dans votre situation, je recommande (1).

Espérons que cela aide.

Cheers Alex

Questions connexes