2009-12-22 22 views
7

Tengo 2 tablas, Table1 tiene una clave principal 'CustomizationId', y Table2 tiene un FK Customizationid que coincide con esto. Table2 no tiene clave principal.¿Cómo se actualiza una tabla con una clave externa a otra tabla en el modelo de entidad ADO.Net?

Estoy tratando de agregar un nuevo registro desde un formulario basado en web. Intento de salvar esto a la base de datos y me sale un error:

  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(); 

Cuando llamo SaveChanges que estoy recibiendo un error, sea o no añado en la línea comentada.

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. 

¿Cómo manejo esta situación? Solo quiero agregar el código al mismo tiempo que lo agrego en la personalización. La tabla 'Código' debe tener el Customizationid configurado en PK/Identidad establecida por Personalización.

¿Alguna idea?

Respuesta

7

En lo que se refiere a EF, la tabla sin PK es una Vista.

Esto significa que tiene dos opciones:

  1. contar una pequeña mentira, y convencer a la EF que la 'view' is a table
  2. Add modification functions (Insertar/Actualizar/Eliminar) para que pueda editar ellos.

Generalmente funciones de modificación son los procedimientos almacenados, pero en realidad se pueden añadir T-SQL directamente a la SSDL si usted no tiene acceso a la base de datos ...

es decir, algo como esto en el elemento <StorageModel> del EDMX para cada acción (insertar, actualizar y eliminar):

<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> 

Una vez que tenga las funciones de modificación en su SSDL es necesario map them para que el EF los utiliza según sea necesario.

En su situación lo recomiendo (1).

Espero que esto ayude.

Cheers Alex

Cuestiones relacionadas