Tengo una tabla en mi base de datos llamada SEntries (ver abajo la declaración CREATE TABLE). Tiene una clave principal, un par de claves externas y nada especial. Tengo muchas tablas en mi base de datos similares a esa, pero por alguna razón, esta tabla terminó con una columna "Discriminador" en la Clase Proxy EF.
Así es como se declara la clase en C #:
public class SEntry
{
public long SEntryId { get; set; }
public long OriginatorId { get; set; }
public DateTime DatePosted { get; set; }
public string Message { get; set; }
public byte DataEntrySource { get; set; }
public string SourceLink { get; set; }
public int SourceAppId { get; set; }
public int? LocationId { get; set; }
public long? ActivityId { get; set; }
public short OriginatorObjectTypeId { get; set; }
}
public class EMData : DbContext
{
public DbSet<SEntry> SEntries { get; set; }
...
}
Cuando intento agregar una nueva fila a esa tabla, aparece el error:
System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.
Este problema solo ocurre si está heredando su clase C # de otra clase, pero SEntry no está heredando nada (como puede ver arriba).
Además de eso, una vez que obtengo la información sobre herramientas en el depurador cuando paso el mouse sobre la instancia EMData para la propiedad SEntries, muestra:
base {System.Data.Entity.Infrastructure.DbQuery<EM.SEntry>} = {SELECT
[Extent1].[Discriminator] AS [Discriminator],
[Extent1].[SEntryId] AS [SEntryId],
[Extent1].[OriginatorId] AS [OriginatorId],
[Extent1].[DatePosted] AS [DatePosted],
[Extent1].[Message] AS [Message],
[Extent1].[DataEntrySource] AS [DataE...
¿Alguna sugerencia o idea de dónde llegar al fondo de este problema? Intenté cambiar el nombre de la tabla, la clave principal y algunas otras cosas, pero nada funciona.
Tabla SQL:
CREATE TABLE [dbo].[SEntries](
[SEntryId] [bigint] IDENTITY(1125899906842624,1) NOT NULL,
[OriginatorId] [bigint] NOT NULL,
[DatePosted] [datetime] NOT NULL,
[Message] [nvarchar](500) NOT NULL,
[DataEntrySource] [tinyint] NOT NULL,
[SourceLink] [nvarchar](100) NULL,
[SourceAppId] [int] NOT NULL,
[LocationId] [int] NULL,
[ActivityId] [bigint] NULL,
[OriginatorObjectTypeId] [smallint] NOT NULL,
CONSTRAINT [PK_SEntries] PRIMARY KEY CLUSTERED
(
[SEntryId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[SEntries] WITH CHECK ADD CONSTRAINT [FK_SEntries_ObjectTypes] FOREIGN KEY([OriginatorObjectTypeId])
REFERENCES [dbo].[ObjectTypes] ([ObjectTypeId])
GO
ALTER TABLE [dbo].[SEntries] CHECK CONSTRAINT [FK_SEntries_ObjectTypes]
GO
ALTER TABLE [dbo].[SEntries] WITH CHECK ADD CONSTRAINT [FK_SEntries_SourceApps] FOREIGN KEY([SourceAppId])
REFERENCES [dbo].[SourceApps] ([SourceAppId])
GO
ALTER TABLE [dbo].[SEntries] CHECK CONSTRAINT [FK_SEntries_SourceApps]
GO
fuente
Respuestas:
Resulta que Entity Framework supondrá que cualquier clase que herede de una clase POCO que está asignada a una tabla en la base de datos requiere una columna Discriminator, incluso si la clase derivada no se guardará en la base de datos.
La solución es bastante simple y solo necesita agregar
[NotMapped]
como un atributo de la clase derivada.Ejemplo:
Ahora, incluso si asigna la clase Persona a la tabla Persona en la base de datos, no se creará una columna "Discriminador" porque la clase derivada sí
[NotMapped]
.Como consejo adicional, puede usar
[NotMapped]
propiedades que no desea asignar a un campo en la base de datos.fuente
Aquí está la sintaxis de Fluent API.
http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx
fuente
[NotMapped]
atributo?Acabo de encontrar esto y mi problema fue causado por tener dos entidades con
System.ComponentModel.DataAnnotations.Schema.TableAttribute
referencias a la misma tabla.por ejemplo:
cambiando el segundo de
foo
afoo_extended
arreglado esto para mí y ahora estoy usando Tabla por tipo (TPT)fuente
The entity types 'AtencionMedica' and 'AtencionMedicaAP' cannot share table 'AtencionMedicas' because they are not in the same type hierarchy
var entity = modelBuilder.Entity<EntityObject>().ToTable("ENTITY_TABLE")
y luego otra línea que usaba lo mismoEntityObject
o lo mismoENTITY_TABLE
.Otro escenario en el que esto ocurre es cuando tiene una clase base y una o más subclases, donde al menos una de las subclases introduce propiedades adicionales:
Si se asignan de la
DbContext
siguiente manera, se produce el error "'Nombre de columna no válido' Discriminador '" cuandoFolder
se accede a cualquier tipo basado en el tipo base:Descubrí que para solucionar el problema, extraemos los accesorios de
Folder
una clase base (que no está asignadaOnModelCreating()
) de esta manera, noOnModelCreating
debería modificarse:Esto elimina el problema, ¡pero no sé por qué!
fuente
Me sale el error en otra situación, y aquí están el problema y la solución:
Tengo 2 clases derivadas de una misma clase base llamada LevledItem:
Pero en su DbContext, copié un código pero olvido cambiar uno de los nombres de clase:
Sí, el segundo Mapa <Equipo> debería ser Mapa <Historia>. ¡Y me costó medio día resolverlo!
fuente
Tuve un problema similar, no exactamente las mismas condiciones y luego vi esta publicación . Espero que ayude a alguien. Aparentemente estaba usando uno de mis modelos de entidad EF, una clase base para un tipo que no se especificó como un conjunto de bases de datos en mi dbcontext. Para solucionar este problema, tuve que crear una clase base que tuviera todas las propiedades comunes a los dos tipos y heredar de la nueva clase base entre los dos tipos.
Ejemplo:
fuente
este error ocurrió conmigo porque hice lo siguiente
Update Model from database
en Edmx) Cambié el nombre manualmente Nombre de propiedad para que coincida con el cambio en el esquema de la base de datosAunque todo esto, recibí este error
entonces
what to do
Update Model from database
esto regenerará el modelo, y el marco de la entidad
will
nogive you this error
espero que esto te ayude
fuente
Antigua Q, pero para la posteridad ... también sucede (.NET Core 2.1) si tiene una propiedad de navegación autorreferenciada ("Principal" o "Secundario" del mismo tipo) pero el nombre de la propiedad Id no es lo que EF espera. Es decir, tenía una propiedad "Id" en mi clase llamada
WorkflowBase
, y tenía una serie de pasos secundarios relacionados, que también eran de tipoWorkflowBase
, y seguía intentando asociarlos con un "WorkflowBaseId" inexistente (el nombre i supongamos que prefiere como un defecto natural / convencional). Tuve que configurar explícitamente el usoHasMany()
,WithOne()
yHasConstraintName()
para decir que la forma de atravesar. Pero pasé unas horas pensando que el problema estaba en el mapeo 'localmente' de la clave primaria del objeto, que intenté arreglar de muchas maneras diferentes, pero que probablemente siempre estaba funcionando.fuente