2008-12-01 16 views
10

Estoy intentando configurar Entity Framework con SQL Server 2008. Estoy usando Guids para las claves en mis tablas. ¿Hay alguna manera de configurarlo para que las claves sean generadas automáticamente por la base de datos? Intenté configurar "RowGuid" como verdadero y también establecí el valor predeterminado de la columna como "(newid())". De cualquier manera, la clase mapeada todavía me necesita para darle un Guid en el lado C#. ¿Algunas ideas?Entity Framework Guid

Respuesta

6

Not yet:

17.4.Can Puedo usar un GUID como mi clave de entidad generado por el servidor?

Desafortunadamente, en v1 de EF esto no es compatible. Si bien es posible que SQL Server tenga una columna de tipo "uniqueidentifier" y que su valor predeterminado sea "newid()", con SQL Server 2000 no hay una buena forma de extraer el valor que generó el servidor en ese momento. hacer la inserción. Sin embargo, esto se puede hacer en versiones más recientes de SQL Server, por lo que la intención es que debamos encontrar una manera limpia de este soporte en versiones futuras de EF para que pueda ser soportado en aquellas bases de datos que lo permiten y no en otros. Por ahora, la solución alternativa es generar el guid en el cliente (idealmente en el constructor de su objeto) en lugar de hacerlo en el servidor.

2

Desde un GUID es una estructura, un valor nulo nunca se pasa por lo que los valores por defecto no entran en juego Usted podría considerar un nullable Guid:. Guid ?, aunque esto puede causar dolores de cabeza como se ha mencionado en este post:

Nullable GUID

me pareció más fácil simplemente inicializar el GUID con un nuevo valor:

private Guid _identifier = Guid.NewGuid(); 

Si se trata de un registro existente, será reemplazado cuando el objeto está poblada. De lo contrario, se insertará el valor inicializado.

+0

utilizando un gule nullable funciona mientras la columna no esté configurada como (o como parte de) la clave de entidad, en cuyo caso se producirá un error. Me gusta la sugerencia de inicialización, aunque parece que esto debería suceder de forma automática si reconoce la combinación Guid/Key de las propiedades de ese campo. – Rob

3

Personalmente, creo que cualquiera que esté utilizando EF estaría dispuesto a renunciar a la compatibilidad con SQL Server 2000 para obtener las características que necesitan. Parece que cada cosa a medio camino no trivial que tengo que hacer en EF no es compatible debido al hecho de que tienen que mantener la compatibilidad con SQL Server 2000.

¡Cuándo terminará!

2

Más fácil con v4.

Una manera mejor que tener que cambiar el edmx es el bit que tengo a continuación que generará Guid's para ti. Comprueba la clave primaria y la refleja para configurarla.

Advertencias: asume una única clave primaria Guid y no la configura por algún motivo propio.

void OgaraEntities_SavingChanges(object sender, EventArgs e) 
{ 
    foreach (ObjectStateEntry entry in 
     ((ObjectContext)sender).ObjectStateManager.GetObjectStateEntries(
     EntityState.Added)) 
    { 
    if (!entry.IsRelationship){ 
     string keyFieldName = entry.EntitySet.ElementType.KeyMembers[0].Name; 
     object entity = entry.Entity; 
     PropertyInfo pi = entity.GetType().GetProperty(keyFieldName); 
     pi.SetValue(entity, Guid.NewGuid(), null); 
    } 
    }  
} 
1

¿Qué tal el método estático en la clase parcial?

public partial class SomeEntity 
{ 
    public static SomeEntity Create() 
    { 
     return new SomeEntity() { Id = Guid.NewGuid(); } 
    } 
}