none
Linq to Entities e Campos Uniqueidentifier PK NewsequentialID() RRS feed

  • Pergunta

  • O Sql server tem uma solução muito bacana para usarmos campos uniqueidentifier como chaves primárias, é a função NewsequentialId() como valor default. Essa função vai gerar uma sequencia em nossos chaves primárias, otimizando assim a indexação dessas chaves.

    No Linq to SQL, ao criarmos uma entidade que a chave primária seja uniqueidentifier e com o valor sendo gerado pelo banco de dados (ou seja, o newsequentialid() do sql server) devemos explicitar que aquela prorpriedade na entidade do linq é "Auto Generated Value = True" e "Auto-Sync = OnInsert"

    No Linq To Entities isso não existe!

    Como eu trabalho no Linq To Entities com chaves primárias uniqueidentifier geradas pelo banco com a função newsequentialid()
    ???

    []´s
    terça-feira, 30 de setembro de 2008 22:07

Respostas

  • Realmente, existe um "bug" no ADO.NET Entities que ele não consegue trabalhar com chaves uniqueidentifier geradas pelo banco de dados.

    Eu usei uma solução bem legal que se adaptou muito bem aos meus códigos.
    Estou usando ele no meu projeto open source, vocês podem ver em http://www.codeplex.com/meudindin

    Eu user uma API do Windows que gera uma chave uniqueidentifier sequencial:

    using System;

    using System.Runtime.InteropServices;

     

    namespace System

    {

        internal static class GuidEx

        {

            [DllImport("rpcrt4.dll", SetLastError = true)]

            private static extern int UuidCreateSequential(out Guid guid);

            private const int RPC_S_OK = 0;

     

            /// <summary>

            /// Generate a new sequential GUID. If UuidCreateSequential fails (or if it generates a "local unique only" guid), fall back on standard random guids.

            /// </summary>

            /// <returns>A GUID</returns>

            public static Guid NewSeqGuid()

            {

                Guid sequentialGuid;

                int hResult = UuidCreateSequential(out sequentialGuid);

                if (hResult == RPC_S_OK)

                {

                    return sequentialGuid;

                }

                else

                {

                    //couldn't create sequential guid, fall back on random guid

                    return Guid.NewGuid();

                }

            }

        }

    }



    quarta-feira, 8 de outubro de 2008 12:50