J'ai une table dans ma base de données appelée SEntries (voir ci-dessous l'instruction CREATE TABLE). Il a une clé primaire, quelques clés étrangères et rien de spécial à ce sujet. J'ai de nombreuses tables dans ma base de données similaires à celle-là, mais pour une raison quelconque, cette table s'est retrouvée avec une colonne "Discriminator" sur la classe proxy EF.
Voici comment la classe est déclarée 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; }
...
}
Lorsque j'essaye d'ajouter une nouvelle ligne à cette table, j'obtiens l'erreur:
System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.
Ce problème se produit uniquement si vous héritez de votre classe C # d'une autre classe, mais SEntry n'hérite de rien (comme vous pouvez le voir ci-dessus).
En plus de cela, une fois que j'obtiens l'info-bulle sur le débogueur lorsque je passe la souris sur l'instance EMData pour la propriété SEntries, elle affiche:
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...
Avez-vous des suggestions ou des idées pour aller au fond de ce problème? J'ai essayé de renommer la table, la clé primaire et quelques autres choses, mais rien ne fonctionne.
Table 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
la source
Réponses:
Il s'avère qu'Entity Framework supposera que toute classe qui hérite d'une classe POCO mappée à une table de la base de données nécessite une colonne Discriminator, même si la classe dérivée ne sera pas enregistrée dans la base de données.
La solution est assez simple et il vous suffit d'ajouter
[NotMapped]
comme attribut de la classe dérivée.Exemple:
Désormais, même si vous mappez la classe Person à la table Person de la base de données, une colonne "Discriminator" ne sera pas créée car la classe dérivée l'a fait
[NotMapped]
.Comme astuce supplémentaire, vous pouvez utiliser
[NotMapped]
les propriétés que vous ne souhaitez pas mapper à un champ de la base de données.la source
Voici la syntaxe de l'API Fluent.
http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx
la source
[NotMapped]
attribut?Je viens de rencontrer cela et mon problème a été causé par le fait d'avoir deux entités toutes les deux
System.ComponentModel.DataAnnotations.Schema.TableAttribute
faisant référence à la même table.par exemple:
changer le second de
foo
àfoo_extended
corrigé cela pour moi et j'utilise maintenant la table par type (TPT)la source
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")
puis une autre ligne utilisant soit le mêmeEntityObject
soit le mêmeENTITY_TABLE
.Un autre scénario dans lequel cela se produit est lorsque vous avez une classe de base et une ou plusieurs sous-classes, où au moins une des sous-classes introduit des propriétés supplémentaires:
Si ceux-ci sont mappés
DbContext
comme ci-dessous, l'erreur "'Nom de colonne non valide' Discriminateur '" se produit lors de l'Folder
accès à un type basé sur le type de base:J'ai trouvé que pour résoudre le problème, nous extrayons les accessoires de
Folder
dans une classe de base (qui n'est pas mappéeOnModelCreating()
) comme ceci -OnModelCreating
devrait être inchangée:Cela élimine le problème, mais je ne sais pas pourquoi!
la source
J'obtiens l'erreur dans une autre situation, et voici le problème et la solution:
J'ai 2 classes dérivées d'une même classe de base nommée LevledItem:
Mais dans leur DbContext, j'ai copié du code mais j'ai oublié de changer l'un des noms de classe:
Oui, la deuxième carte <Équipe> doit être Carte <Histoire>. Et ça m'a coûté une demi-journée pour le découvrir!
la source
J'ai eu un problème similaire, pas exactement les mêmes conditions et puis j'ai vu ce post . J'espère que ça aide quelqu'un. Apparemment, j'utilisais l'un de mes modèles d'entité EF une classe de base pour un type qui n'était pas spécifié comme un ensemble de bases de données dans mon dbcontext. Pour résoudre ce problème, j'ai dû créer une classe de base qui avait toutes les propriétés communes aux deux types et hériter de la nouvelle classe de base parmi les deux types.
Exemple:
la source
cette erreur s'est produite avec moi parce que j'ai fait ce qui suit
Update Model from database
dans Edmx) J'ai renommé manuellement le nom de la propriété pour correspondre au changement de schéma de base de donnéesBien que tout cela, j'ai eu cette erreur
alors
what to do
Update Model from database
cela régénérera le modèle et le cadre d'entité
will
nongive you this error
j'espère que cela vous aidera
la source
Ancien Q, mais pour la postérité ... cela arrive aussi (.NET Core 2.1) si vous avez une propriété de navigation auto-référencée ("Parent" ou "Children" du même type) mais que le nom de la propriété Id n'est pas ce EF attend. Autrement dit, j'avais une propriété "Id" sur ma classe appelée
WorkflowBase
, et elle avait un tableau d'étapes enfants associées, qui étaient également de typeWorkflowBase
, et elle essayait de les associer à un "WorkflowBaseId" inexistant (le nom i supposons qu'il préfère comme valeur par défaut naturelle / conventionnelle). Je devais configurer explicitement à l'aideHasMany()
,WithOne()
etHasConstraintName()
pour lui dire comment traverser. Mais j'ai passé quelques heures à penser que le problème résidait dans le mappage `` local '' de la clé primaire de l'objet, ce que j'ai tenté de résoudre de différentes manières mais qui fonctionnait probablement toujours.la source