c# - net - entity framework code first tutorial español
El tipo de entidad<tipo> no es parte del modelo para el contexto actual (9)
Estoy entrando en el Marco de la Entidad, pero no estoy seguro de si me falta un punto crítico en el enfoque del primer código.
Estoy usando un patrón de repositorio genérico basado en el código de https://genericunitofworkandrepositories.codeplex.com/ y he creado mis entidades.
Pero cuando intento acceder o modificar la entidad me encuentro con lo siguiente:
System.InvalidOperationException: el tipo de entidad Estate no es parte del modelo para el contexto actual.
Ocurre cuando intento acceder desde mi repositorio:
public virtual void Insert(TEntity entity)
{
((IObjectState)entity).ObjectState = ObjectState.Added;
_dbSet.Attach(entity); // <-- The error occurs here
_context.SyncObjectState(entity);
}
La base de datos (./SQLEXPRESS) se crea muy bien, pero las entidades (tablas) simplemente no se crean en el inicio.
Me pregunto si necesito establecer explícitamente el mapeo de las entidades. ¿EF no puede hacerlo por sí mismo?
Mi entidad es:
public class Estate : EntityBase
{
public int EstateId { get; set; }
public string Name { get; set; }
}
Mi contexto es así:
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>();
}
}
¿Hay alguna razón específica por la cual ocurre este error? He intentado habilitar migraciones y habilitar migraciones automáticas sin ninguna ayuda tampoco.
Aparentemente, este error es muy genérico, podría tener varias razones. En mi caso, fue el siguiente: La cadena de conexión (en Web.config) generada por .edmx
no era válida. Después de casi un día de probar todo, cambié la cadena de conexión de la cadena EF a una cadena ADO.NET. Esto resolvió mi problema.
Por ejemplo, la cadena EF se ve más o menos así:
<connectionStrings>
<add name="BlogContext"
connectionString="metadata=res://*/BloggingModel.csdl|
res://*/BloggingModel.ssdl|
res://*/BloggingModel.msl;
provider=System.Data.SqlClient
provider connection string=
"data source=(localdb)/v11.0;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
providerName="System.Data.EntityClient" />
</connectionStrings>
Y la cadena ADO.NET se ve así:
<connectionStrings>
<add name="BlogContext"
providerName="System.Data.SqlClient"
connectionString="Server=./SQLEXPRESS;Database=Blogging;
Integrated Security=True;"/>
</connectionStrings>
El problema puede estar en la cadena de conexión. Asegúrese de que su cadena de conexión sea para el proveedor SqlClient, sin elementos de metadatos relacionados con EntityFramework.
He visto este error cuando una tabla existente en la base de datos no se asigna correctamente a un primer modelo de código. Específicamente, tenía un char (1) en la tabla de la base de datos y un carácter en C #. Cambiar el modelo a una cadena resolvió el problema.
Otra cosa que debe verificar con su cadena de conexión: el nombre del modelo. Estaba usando dos modelos de entidades, DB primero. En la configuración, copié la conexión de entidad para uno, le cambié el nombre y cambié la parte de la cadena de conexión. Lo que no cambié fue el nombre del modelo, por lo tanto, mientras que el modelo de entidad se generó correctamente, cuando se inició el contexto, EF buscaba el modelo incorrecto para las entidades.
Parece evidente anotado, pero hay cuatro horas que no recuperaré.
Para mí, el problema era que no había incluido la clase de entidad dentro de mi conjunto de bases de datos dentro del contexto para el marco de entidad.
public DbSet<ModelName> ModelName { get; set; }
Pon esto en tu clase personalizada DbContext
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Estate>().ToTable("Estate");
}
Si sus tablas no se crean al inicio, esta es la razón. Debe informar al DbContext sobre ellos en la anulación del método OnModelCreating.
Puede hacer asignaciones personalizadas por entidad aquí, o separarlas en EntityTypeConfiguration<T>
separadas EntityTypeConfiguration<T>
.
Puede intentar eliminar la tabla del modelo y volver a agregarla. Puede hacerlo visualmente abriendo el archivo .edmx desde Solution Explorer.
Pasos:
- Haga doble clic en el archivo .edmx del Explorador de soluciones
- Haga clic derecho en el encabezado de la tabla que desea eliminar y seleccione "Eliminar del modelo"
- Ahora, de nuevo, haga clic con el botón derecho en el área de trabajo y seleccione "Actualizar modelo desde la base de datos ...".
- Agregue la tabla nuevamente desde la lista de la tabla
- Limpia y construye la solución
Suena obvio, pero asegúrese de no ignorar explícitamente el tipo:
modelBuilder.Ignore<MyType>();
el mapa de la entidad (incluso uno vacío) agregado a la configuración llevará a que el tipo de entidad sea parte del contexto. Tuvimos una entidad sin relación con otras entidades que se arregló con un mapa vacío.