Pergunta

Estou tentando implantar meu aplicativo em um ambiente de teste, mas não consigo fazer o Entity Framework funcionar bem com o banco de dados. No desenvolvimento, uso um inicializador de banco de dados para propagar o banco de dados e que funcionou perfeitamente. No entanto, quando implanto o aplicativo em uma instância real do IIS, não consigo fazer a interface com o banco de dados. Minhas regras de inicialização personalizadas não são executadas, então estou criando o banco de dados manualmente.

Usei ObjectContext.CreateDatabaseScript () como ponto de partida para meu script SQL e o SSMS verifica se duas linhas estão preenchidas na tabela apropriada.

Meu problema surge depois de executar o aplicativo. Tenho associações personalizadas e provedores de função, nenhum dos quais parece detectar a existência de duas funções no banco de dados.

Como faço para que minha estrutura de entidade reconheça que essas linhas não estão vazias? No momento, estou usando um DbContext privado dentro de um repositório para lidar com a comunicação com o Entity Framework e desativei meu inicializador personalizado até que esse problema seja resolvido.

Código que tenta encontrar funções no banco de dados:

context.Roles.Single(r => r.Name == role)

O banco de dados mostra o seguinte na tabela de funções:

Id  Name     Description
1   Company  NULL
2   Customer NULL

O LINQ gera uma exceção de sequência vazia, como context.Roles is empty.

Foi útil?

Solução 2

Aqui estão as etapas que executei para migrar de um projeto code first com uma implementação personalizada de IDatabaseInitializer que redefiniu o banco de dados durante cada sessão para uma configuração de banco de dados não volátil.

Primeiro, copie o esquema gerado pelo Entity Framework em seu dev. projeto executando o seguinte código e colocando a saída em um local acessível (por exemplo: arquivo no desktop, texto bruto no navegador, etc). contexto é uma instância de sua classe que herda de DbContext :

((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()

Em segundo lugar, salve a string retornada dessa chamada em um arquivo SQL. Certifique-se de remover o comando que cria a tabela de metadados do Entity Framework. Este comando deve ser semelhante ao seguinte:

create table [dbo].[EdmMetadata] 
( 
    [Id] [int] not null identity, 
    [ModelHash] [nvarchar](max) null, 
    primary key ([Id]) 
);

Em seguida, remova o código que alimenta o banco de dados. Usei um AppSetting para alternar facilmente o uso desse código após a implantação, sem precisar recompilar e implantar.

if (ConfigurationManager.AppSettings["Mode"] == "Dev")
{
    Database.SetInitializer<PonosContext>(new PonosInitializer());
    new MyContext().Database.Initialize(true);
}

Imediatamente fora dessa instrução, você ainda precisa inicializar o banco de dados, mas certifique-se de passar falso para que a inicialização só aconteça se o banco de dados não tiver sido inicializado.

new MyContext().Database.Initialize(false);

Finalmente, execute o SQL de configuração em um banco de dados vazio para que as tabelas sejam criadas com os campos apropriados.

Se você implantar e executar seu aplicativo, ele deve se conectar ao banco de dados e ser capaz de funcionar normalmente com quaisquer dados carregados em um script externo. Testei esse método com êxito com associações personalizadas e provedores de funções.

Outras dicas

A julgar pelos comentários, parece que não há conexão entre o Entity Framework e o banco de dados.Você não menciona qual versão do Entity Framework está usando, mas presumo que tenha atualizado para a mais recente (4.3 no momento da escrita).

Percebi que você diz que está "criando o banco de dados manualmente.".Por que não abrir um projeto de teste e criar um novo modelo de banco de dados primeiro com base no banco de dados criado manualmente?Isso deve pelo menos confirmar que você pode usar o Entity Framework com sua configuração. A partir daí, eu criaria outro projeto do zero para testar a abordagem Code First.

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