Estou entrando no Entity Framework, mas não tenho certeza se estou perdendo um ponto crítico na abordagem de primeiro código.
Estou usando um padrão de repositório genérico baseado no código de https://genericunitofworkandrepositories.codeplex.com/ e criei minhas entidades.
Mas quando tento acessar ou modificar a entidade, deparo com o seguinte:
System.InvalidOperationException: O tipo de entidade Estate não faz parte do modelo para o contexto atual.
Isso acontece quando estou tentando acessá-lo no meu repositório:
public virtual void Insert(TEntity entity)
{
((IObjectState)entity).ObjectState = ObjectState.Added;
_dbSet.Attach(entity); // <-- The error occurs here
_context.SyncObjectState(entity);
}
O banco de dados (./SQLEXPRESS) é criado perfeitamente, mas as entidades (tabelas) simplesmente não são criadas na inicialização.
Eu estou querendo saber se eu preciso definir explicitamente o mapeamento das entidades? A EF não pode fazer isso sozinha?
Minha entidade é:
public class Estate : EntityBase
{
public int EstateId { get; set; }
public string Name { get; set; }
}
Meu contexto é o seguinte:
public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
public DimensionWebDbContext() :
base("DimensionWebContext")
{
Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
Configuration.ProxyCreationEnabled = false;
}
public new IDbSet<T> Set<T>() where T : class
{
return base.Set<T>();
}
}
Existe algum motivo específico para esse erro ocorrer? Eu tentei habilitar migrações e habilitar migrações automáticas sem qualquer ajuda também.
fonte
OnModelCreating
se suas entidades estiverem na mesma montagem que a suaDbContext
. Eu nunca usei anotações de dados para entidades, portanto, não posso dizer com certeza. Você sempre pode digitalizar montagens no seuOnModelCreating
para encontrar entidades em outras montagens e registrá-las automaticamente (que é o que o Tripod faz).Aparentemente, esse erro é muito genérico, pode ter várias razões. No meu caso, foi o seguinte: A cadeia de conexão (no Web.config) gerada pelo
.edmx
era inválida. Depois de quase um dia tentando de tudo, mudei a cadeia de conexão da cadeia EF para uma cadeia ADO.NET. Isso resolveu meu problema.Por exemplo, a string EF se parece com isso:
E a string ADO.NET fica assim:
Fonte: http://msdn.microsoft.com/nl-nl/data/jj556606.aspx
fonte
EF 4.x
paraEF 6
. Eu tive que regenerar a seqüência de conexão para adicionar uma tabela (DatabaseFirst
). Eu não percebi que meu connectionstring noapp.config
eweb.config
eram diferentes. Uma vez que eu assumi aconnectionstring
partir daapp.config
, ele começou a trabalhar.Para mim, o problema era que eu não havia incluído a classe de entidade no meu conjunto de db dentro do contexto da estrutura da entidade.
fonte
Você pode tentar remover a tabela do modelo e adicioná-la novamente. Você pode fazer isso visualmente, abrindo o arquivo .edmx no Gerenciador de Soluções.
Passos:
fonte
O problema pode estar na cadeia de conexão. Verifique se a cadeia de conexão é do provedor SqlClient, sem nenhum material de metadados relacionado ao EntityFramework.
fonte
Eu vi esse erro quando uma tabela existente no banco de dados não é mapeada adequadamente para um primeiro modelo de código. Especificamente, eu tinha um caractere (1) na tabela do banco de dados e um caractere em C #. Alterar o modelo para uma sequência resolveu o problema.
fonte
Meu problema foi resolvido com a atualização da parte dos metadados da cadeia de conexão. Aparentemente, ele estava apontando para a referência .csdl / .ssdl / .msl errada.
fonte
Outra coisa a verificar com a cadeia de conexão - o nome do modelo. Eu estava usando dois modelos de entidade, o DB primeiro. Na configuração, copiei a conexão da entidade para uma, renomeei-a e alterei a parte da cadeia de conexão. O que não mudei foi o nome do modelo; portanto, enquanto o modelo de entidade foi gerado corretamente, quando o contexto foi iniciado, a EF procurava no modelo errado as entidades.
Parece óbvio, mas há quatro horas que eu não voltarei.
fonte
Para mim, o problema era que eu usei o
connection string
gerado peloADO.Net
Model (.edmx). Alterar a cadeia de conexão resolveu meu problema.fonte
Isso também pode ocorrer se você estiver usando um cache de modelo persistente desatualizado por um motivo ou outro. Se o seu contexto foi armazenado em cache em um arquivo EDMX em um sistema de arquivos (via DbConfiguration.SetModelStore), o OnModelCreating nunca será chamado, pois a versão em cache será usada. Como resultado, se uma entidade estiver ausente no seu armazenamento em cache, você receberá o erro acima, mesmo que a cadeia de conexão esteja correta, a tabela exista no banco de dados e a entidade esteja configurada corretamente no seu DbContext.
fonte
A mensagem era bem clara, mas não a recebi no início ...
Estou trabalhando com dois contextos de banco de dados do Entity Framework
sysContext
eshardContext
no mesmo método.A entidade que eu modifiquei \ updated é de um contexto, mas tentei salvá-lo no outro contexto como este:
mas a versão correta deve ser esta:
Depois de passar a entidade para o contexto correto, esse erro desapareceu.
fonte
Parece óbvio, mas verifique se você não está ignorando explicitamente o tipo:
modelBuilder.Ignore<MyType>();
fonte
O mapa da entidade (mesmo um vazio) adicionado à configuração fará com que o tipo de entidade faça parte do contexto. Tínhamos uma entidade sem relação com outras entidades que foi corrigida com um mapa vazio.
fonte
se você estiver tentando primeiro o banco de dados, verifique se sua tabela possui chave primária
fonte
O Visual Studio 2019 parece causar isso para mim. Corrigi-o gerando o modelo edmx novamente em 2017.
fonte
Tenho o mesmo problema no Entity Framewrok e o resolvi sob as etapas:
1-Abra o Model.edmx 2-altere o local da tabela (para fazer alterações no arquivo cs) 3-salve-o
Espero te ajudar
fonte
Exclua o arquivo .edmx e adicione-o novamente. Especialmente, se você atualizou o Entity Framework.
fonte
Eu estava enfrentando o mesmo problema com o EntityFrameworkCore tentando atualizar um intervalo de valores.
Essa abordagem não funcionou
Depois de adicionar o método UpdateRange e remover a conexão e entrada, tudo funciona
fonte
Para mim, foi causado porque renomeei a classe de entidade. Quando o revirei, estava ok.
fonte
Pode ser estúpido, mas se você tiver esse erro em alguma tabela, não se esqueça de limpar seu projeto e reconstruir (isso pode economizar muito tempo)
fonte
Eu tive isso
Isso estava em um método assíncrono, mas eu esqueci de aguardar antes de GetEntryAsync e, por isso, recebi o mesmo erro ...
fonte