Compartir a través de


Entity Framework FAQ: Asignación y Modeling (es-ES)

Volver a EF FAQ tabla de contenido

¿Cómo puedo asignar un procedimiento almacenado?

El sistema de asignación de EF admite asignación de procedimientos almacenados para todos cuatro CRUD (Create, Read, Update y Delete) operaciónes. Para obtener información más detallada y un ejemplo completo que explica como leer entidades usando un procedimiento almacenado, consulte:

¿Cómo puedo asignar las entidades de sólo lectura? ¿Cómo puedo utilizar Defining QueryViews en archivos de asignación?

Una forma de asignar las entidades sólo lectura es utilizar una consulta de definición. Ver entidades de sólo lectura de asignación y QueryView elemento (EntitySetMapping) para obtener más detalles.

Cuando estoy usando ""modelo-primero"", ¿cómo puedo personalizar la secuencia de comandos DDL generado de mi modelo?

Al generar la secuencia de comandos DDL del modelo, hay casos cuando puede que desee personalizar el SQL generado. Por ejemplo, cuando usted tiene una propiedad de tipo binario en el modelo y que desee asignar a timestamp o rowversion (rowversion debe utilizarse en lugar de timestamp empezando con SQL Server 2008) actualmente, no puede hacerlo en el diseñador. Puede personalizar la plantilla de T4 que hace el script de generación de DDL haciendo lo siguiente:

1. Añadir una anotación estructurada a CSDL, declarando su propio espacio de nombres y, a continuación, añadiendo un elemento utilizando ese espacio de nombres:

<Schema xmlns=" " http://schemas.Microsoft.com/ADO/2008/09/EDM"
...
xmlns:mi=" "http://tempuri.org/DatabaseTypes">
<Property Type=" "Binario" " Nombre=" "Fecha y hora" " Que acepta valores NULL=" "falso">
<mi:tipo_de_base_de_datos edmx:CopyToSSDL=" "verdadero" ">TIMESTAMP< /mi:tipo_de_base_de_datos>
</Propiedad>

Para obtener más información, consulte http://blogs.msdn.com/b/efdesign/archive/2008/08/12/structural-annotations-one-pager.aspx .

La anotación de CopyToSSDL dice a la tubería de generación de base de datos que copie la anotación al SSDL.

  1. Hacer una copia del archivo SSDLToSQL10.tt, ubicado en el directorio '%localappdata%\Microsoft\AppId]\10.0\Extensions\Microsoft\Entity marco Tools\DBGen' y colocar la copia en el mismo o en un directorio diferente. Tenga en cuenta que no es recomendable modificar el SSDLToSQL10.tt original.
  2. Modificar la copia del archivo .tt así el primer modelo de flujo de trabajo leerá esta anotación y utilizarla para determinar el tipo de base de datos, en lugar de utilizar la lógica integrada para generar la secuencia de comandos DDL.

Por ejemplo, encontrar la siguiente línea de código en el archivo .tt:

[<#=Id(prop.Name)#>] <#=prop.ToStoreType()#> <#=WriteIdentity(prop, targetVersion)#> <#=WriteNullable(prop.Nullable)#> <#=(p < entitySet.ElementType.Properties.Count - 1) ? "," : ""#> 

Y reemplácelo con el código que lee la anotación (si existe) y su valor se utiliza en lugar del valor incorporado para el tipo de base de datos:

[< # = id (prop.Nombre) # >]
< If (prop.MetadataProperties.Contains ("http://tempuri.org/DatabaseTypes:databasetype "))
{
MetadataProperty annotationProperty = prop.MetadataProperties ["http://tempuri.org/DatabaseTypes:databasetype "];
XElement e = XElement.Parse(annotationProperty.Value.ToString());
valor de cadena = e.Value.Trim();
# >< # = valor # >< #
} else {}
# >< # = prop.ToStoreType() # >< #}
# >< # = WriteIdentity (prop, targetVersion)
# >< # = WriteNullable (prop.NULL)
¿# >< # =(p < entitySet.ElementType.Properties.Count-1)? "," : ""
#>

Nota: Para hacer el código anterior funcione, hay que añadir algunos conjuntos y espacios de nombres:

< # @ name="System.Xml.Linq Asamblea" # >
< # @ name="System.Xml Asamblea" # >
< # @ import namespace="System.Xml.Linq" # >
< # @ import namespace="System.Xml" # >

  • Especifique el nuevo nombre de archivo para su modelo, por lo que el Asistente para crear base de datos ahora utilizará la plantilla de texto especificado cuando se genera de DDL de SSDL. Para ello, haga clic en la superficie del diseñador de la entidad y establecer el nuevo valor de la propiedad de plantilla de generación de DDL en la ruta de acceso del archivo .tt personalizado. Para obtener más información, consulte Cómo: personalizar la generación de base de datos .

¿Por qué me sale "Error 2062: ninguna asignación entre la entidad y asociación conjunto?"

Obtendrá este error cuando se inicia con el modelo primero y que no ha generado aún las tablas. El modelo no validará hasta que todos los objetos en el modelo se asignan a la base de datos. Después de hacer genera base de datos del modelo, este error debería desaparecer.

Nunca elimino registros de mis tablas, pero tengo un indicador que señala si un registro está activo o no. Nunca deseo mostrar los registros que no están activos en el cliente. ¿Cómo puedo permanentemente filtrarlos?

Es necesario agregar una condición para la columna activa de su tipo de entidad. Deberá quitar la asignación de la columna activa y también quitar la propiedad activa desde el tipo de entidad (en este orden). Considere el siguiente ejemplo. Aquí tenemos un tipo de Entity2 que tiene la propiedad activa. Esta propiedad es de un tipo de bit en SQL Server.

Tenemos que añadir la condición de que especifica sólo traer de vuelta las entidades donde Active = 1, desactive la asignación y quitar la propiedad activa de Entity2, como se muestra en la siguiente captura de pantalla.

Ahora cuando ejecutamos una consulta para devolver los resultados del tipo Entity2, devolverá sólo registros donde activo se establece en 1.

foreach (var e in context.Entity2) Console.WriteLine(e.ID); 

El cliente podrá probablemente también desee agregar cierta lógica que se encarga de no eliminar objetos, pero en su lugar actualizar la columna activa. Por ejemplo:

public override int SaveChanges(SaveOptions options) 
{
foreach (ObjectStateEntry entry in ObjectStateManager.GetObjectStateEntries(
EntityState.Deleted))
{
// Change the status to Unchanged, since we don't want for the Entity Framework
// to issue a delete command.
Entity2 e = entry.Entity as Entity2;
entry.ChangeState(EntityState.Unchanged);

// Update the Active columns in the database.
ExecuteStoreCommand("UPDATE Entity2 SET Active = 0 WHERE Entity2.ID = {0}", e.ID);
}
return base.SaveChanges(options);
}

¿Es posible asignar vistas a tipos complejos?

Sí. Entity Framework admite vistas a asignación de tipo complejo. Vistas realmente no son diferentes que las tablas salvo que la EF no tiene al mismo tiempo información de esquema sobre ellos en el sentido de que no sabe exactamente a los valores de clave, etc.. Tenga en cuenta que no puede haber una clave de entidad de un tipo complejo. Las claves deben estar compuestas de una o más propiedades que son tipos primitivos.

¿Hay una manera de especificar valores predeterminados para las columnas? Algunas columnas DateTime en mi base de datos se configuran a getdate(), pero la EF no es consciente de estos valores por defecto.

Si establece la StoreGeneratedPattern de identidad (si el valor se calcula sólo en Insertar) o Computed (si se calcula en cada actualización), a continuación, cuando llames SaveChanges EF obtendrá el valor generado en la base de datos y que vuelva a actualizar su objeto. La EF no establecerá automáticamente el valor cuando se crea un nuevo objeto porque el cómputo ocurre realmente en la base de datos.

También tenga en cuenta que hay una propiedad de StoreGeneratedPattern sobre las propiedades de sus entidades en el diseñador EDM, pero sólo se utiliza para el modelo primero. Si invierte el ingeniero su modelo desde la base de datos, entonces usted necesita actualizar manualmente la sección SSDL del archivo EDMX tener el atributo StoreGeneratedPattern en la propiedad de la entidad correspondiente. Esto es algo que debe abordarse en futuras versiones del diseñador EF (de modo que la propiedad en el diseñador trabaja para escenarios modelo primera y primera base de datos).

¿Hay alguna manera para asignar un procedimiento almacenado a una asociación en el diseñador?

No.

Volver a EF FAQ tabla de contenido