Generar Guid en Serverside Entity Framework 5?

Vengo de un nhibernate de fondo y me pregunto ¿cómo puedo generar el Guid de forma automática en el serer lado y no hacer un viaje de ida y vuelta se hacen en la base de datos secundarios?

En fluidez nhibernate es simple

   Id(x => x.Id).GeneratedBy.GuidComb();

OriginalEl autor chobo2 | 2013-04-30

3 Kommentare

  1. 17

    Si quieres generar la clave en el servidor, sólo tiene que hacer esto en el código:

    public class TestObject 
    {
        public TestObject() 
        {
            Id = Guid.NewGuid();
        }
        public Guid Id { get; set; }
    }

    Si quieres la base de datos para generar la clave, a continuación, utilizar la DatabaseGenerated atributo:

    public class TestObject 
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }
    }

    Si usted está después de usar secuencial Guid, entonces no hay ninguna respuesta fácil en el momento. Algunos ejemplos que obtener a lo largo del camino de la derecha:

    En Nhibernate han GuidComb lo que es supuestamente mejor. No importa con EF? Cualquier ventaja entre las 2 maneras en EF. En nhibernate no recomiendo hacer db generado.
    Ah, no era consciente del PEINE de diferencia. Actualizada la respuesta con algunas opciones más.
    Nota, si usted está generando a partir de la edmx, asegúrese de que el Almacén Genera la Columna a Identidad de la columna que desea GUid ser generado por el servidor.
    Para EF fluent API de ver esto: dailywebtips.blogspot.com/2012/09/…

    OriginalEl autor Richard

  2. 1

    Este código hace lo que usted necesita:

    using System;
    using System.Runtime.InteropServices;
    public static class SequentialGuidProvider
    {
        [DllImport("rpcrt4.dll", SetLastError = true)]
        private static extern int UuidCreateSequential(out Guid guid);
    
        private static Guid CreateGuid()
        {
            Guid guid;
            int result = UuidCreateSequential(out guid);
            if (result == 0)
                return guid;
            else
                return Guid.NewGuid();
        }
    
        public static Guid GuidComb(this Nullable<Guid> guid)
        {
            if (!guid.HasValue) guid = SequentialGuidProvider.CreateGuid();
            return guid.Value;
        }
    }

    Clase de prueba:

    public class TestObject
    {
        public TestObject()
        {
        }
    
        private Nullable<Guid> _guid = null;
        public Guid Id
        {
            get
            {
                _guid = _guid.GuidComb();
                return _guid.Value();
            }
            set
            {
                _guid = value;
            }
        }
    }

    El código de la prueba:

        static void Main(string[] args)
        {
            TestObject testObject1 = new TestObject();
            TestObject testObject2 = new TestObject();
            TestObject testObject3 = new TestObject();
            //simulate EF setting the Id
            testObject3.Id = new Guid("ef2bb608-b3c4-11e2-8d9e-00262df6f594");
    
            //same object same id
            bool test1 = testObject1.Id == testObject1.Id;
            //different object different id
            bool test2 = testObject1.Id != testObject2.Id;
            //EF loaded object has the expected id
            bool test3 = testObject3.Id.Equals(new Guid("ef2bb608-b3c4-11e2-8d9e-00262df6f594"));
        }
    hmm no después de esto. Puedo hacer una forloop con que acepta valores null GUID y se la pasó en el Guidcomb método y sigue generando el mismo Guid. Así que no estoy seguro si en realidad genera otros nuevos.
    Yo no sabía que el código no puede cambiar el pasado en el objeto en el método de extensión. He actualizado el código.
    Hola, cuando uso el código parece cambiar el GUID pero si usted acaba de hacer 3 objetos vacíos y verificación de la IDENTIFICACIÓN de todos ellos son el mismo.
    deben ser casi idénticos porque son secuenciales, es decir, diferentes por un byte.

    OriginalEl autor qujck

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea