Pergunta

Eu estou no processo de concepção de um sistema bastante complexo. Uma das nossas principais preocupações está a apoiar a replicação SQL Server peer-to-peer. A idéia é apoiar vários nós separados geograficamente.

A preocupação secundária tem vindo a utilizar um ORM moderno na camada intermediária. A nossa primeira escolha sempre foi Entity Framework, principalmente porque os desenvolvedores gostam de trabalhar com ele. (Eles amam o apoio LINQ).

Então, aqui está o problema:

Com a replicação peer-to-peer em mente, eu resolvida usando uniqueidentifier com um valor padrão de newsequentialid () para a chave primária de cada mesa. Este parecia fornecer um bom equilíbrio entre evitar colisões chave e reduzir a fragmentação do índice.

No entanto, verifica-se que a versão atual do Entity Framework tem uma muito estranho limitação : se coluna de chave de uma entidade é um uniqueidentifier (GUID), então ele não pode ser configurado para usar o valor padrão (newsequentialid ()) fornecido pelo banco de dados. A camada de aplicação deve gerar o GUID e preencher o valor da chave.

Então aqui está o debate:

  1. abandonar Entity Framework e usar outro ORM:
    • usar NHibernate e dar-se apoio LINQ
    • uso linq2sql e dar-se apoio futuro (para não mencionar se obrigado a SQL Server em DB)
  2. abandonar GUIDs e ir com outra estratégia PK
  3. conceber um método para gerar GUID sequenciais (pentes?) Na camada de aplicação

Estou inclinado para a opção 1 com linq2sql (meus desenvolvedores realmente gosto linq2 [material]) e 3. Isso é principalmente porque eu estou um pouco ignorante das principais estratégias alternativas que suportem o esquema de replicação que está buscando ao mesmo tempo mantendo coisas sã da perspectiva de um desenvolvedor.

Qualquer visão ou opinião seria muito apreciada.

Foi útil?

Solução

Outra opção (não disponível quando este foi publicado) é atualizar para EF 4, que suporta GUIDs gerados pelo servidor.

Outras dicas

Eu segunda sugestão de Craig - a opção 4.

Você sempre pode usar a coluna GUID, povoada por meio-tier, como sua chave primária (que é uma construção lógica).

Para evitar índice de massa (assim: tabela). Fragmentação, usar alguma outra chave (idealmente uma coluna INT IDENTIDADE) como a chave de cluster - que é uma construção de base de dados física, que pode ser separada a partir da chave principal

Por padrão, a chave primária é a chave de cluster -, mas que não tem que ser assim. Na verdade, eu melhor desempenho e drasticamente reduzidos fragmentação fazendo exatamente isso em um banco de dados que "herdou" - adicionar uma coluna de identidade INT e colocar a chave de cluster em que pequena, sempre crescente, nunca muda INT - funciona como um encanto!

Marc

Huh? Acho que seus três opções são uma escolha falsa. Considere a opção 4:

4) Use o Entity Framework com , GUIDs seqüencial não-gerados pelo cliente.

A EF não pode ver GUIDs gerados DB-servidor para novas linhas inseridas pelo próprio framework , claro, mas você não precisa para gerar os GUIDs no servidor DB. Você pode gerá-los no cliente quando você criar suas instâncias de entidade. O ponto inteiro de um GUID é que não importa onde você gerá-lo. Quanto GUIDs gerados por um DB replicado, a EF vai vê-los muito bem.

As suas GUIDs do lado do cliente não será seqüencial (uso Guid.NewGuid ()), mas eles estarão em todo o mundo, garantido único.

Fazemos isso de transporte, produção de software com a replicação. É faz trabalho.

Por que não usar coluna de identidade? Se você estiver fazendo replicação de mesclagem que você pode ter cada início do sistema em uma semente e de trabalho separada em uma direção (por exemplo, um nó começa em 1 e adiciona 1, nó B começa em 0 e subtrai um) ...

Você pode usar procedimentos armazenados, se você está realmente preso em usar NEWSEQUENTIALID (). Você pode vincular as colunas de resultados do procedimento para a propriedade adequada e uma vez inserido o GUID gerado pelo SQL será alimentado de volta para o objeto.

Infelizmente você tem que definir SPs para todas as três operações (insert, update, delete), mesmo que as outras operações iria completar corretamente usando os padrões. Você também precisa manter o código SP e garantir que ele é sincronizado com o seu modelo de EF como você fazer alterações, o que pode tornar esta opção pouco atraente por causa da sobrecarga adicional.

Há um exemplo passo-a-passo de http://blogs.msdn.com/bags/archive/2009/03/12/entity-framework-modeling-action-stored-procedures.aspx que é bastante simples -forward.

uso newseqid com seu próprio ORM (que não é tão difícil) com o LINQ

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top