EF Code First "Ungültige Spalte name 'Diskriminator'", aber keine Vererbung
Ich habe eine Tabelle in meiner Datenbank namens Wachen (siehe unten die CREATE TABLE-Anweisung). Es hat einen Primärschlüssel, ein paar der Fremdschlüssel und nichts besonderes. Ich habe viele Tabellen in meiner Datenbank, ähnlich, aber für einige Grund, diese Tabelle endete mit einem "Diskriminator" - Spalte auf der EF-Proxy-Klasse.
Dies ist, wie die Klasse deklariert ist, in 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; }
...
}
Wenn ich versuche, fügen Sie eine neue Zeile an die Tabelle, erhalte ich die Fehlermeldung:
System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.
Dieses problem tritt nur auf, wenn Sie Erben von Ihrem C# - Klasse von einer anderen Klasse, aber SEntry ist keine Erben von etwas (wie man oben sehen kann).
Zusätzlich zu, dass, sobald ich den tool-tip auf den debugger, wenn ich mit der Maus über die EMData Instanz für die Wachen Eigenschaft, zeigt es:
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...
Irgendwelche Vorschläge oder Ideen, wo man die Unterseite dieses Problem? Ich habe versucht, die Umbenennung der Tabelle, den Primärschlüssel und ein paar andere Dinge, aber nichts funktioniert.
SQL-Tabelle:
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
Ich bekomme diesen Fehler, wenn ich nicht setzen [NotMapped] auf ApplicationUser Klasse in Identitymodel.cs
InformationsquelleAutor Marcelo Calbucci | 2011-07-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellt sich heraus, dass Entity Framework davon aus, dass jede Klasse, die erbt von einer POCO-Klasse zugeordnet wird, zu einer Tabelle auf der Datenbank erfordert eine Diskriminator-Spalte, auch wenn die abgeleitete Klasse wird nicht in der DB gespeichert.
Die Lösung ist ganz einfach und Sie brauchen nur zu addieren
[NotMapped]
als Attribut der abgeleiteten Klasse.Beispiel:
Nun, selbst wenn Sie die Karte der Klasse "Person" in der Person-Tabelle in der Datenbank, ein "Diskriminator", wird die Spalte nicht erstellt werden, da die abgeleitete Klasse hat
[NotMapped]
.Als ein weiterer Tipp, die Sie verwenden können
[NotMapped]
zu Eigenschaften, die Sie nicht wollen, um die Karte auf ein Feld in der DB.Wenn Sie nicht finden [NotMapped] bitte fügen Sie eine Referenz zu: System".ComponentModel.DataAnnotations" das Projekt "Montage-Rahmen".
mit System.ComponentModel.DataAnnotations.Schema;
Wie beheben Sie den Fehler "- Bilder und Metadaten-Informationen konnten nicht gefunden werden EntityType", wenn Sie versuchen, um das viewmodel der db-Sammlung?
aber in meinem Fall habe ich geerbt von Klasse hinzufügen-Spalte in db-Tabelle mit Kind-Klasse. So kann ich nicht verwenden, diese notmapped-Attribut, um es arbeiten. Was sollte meine Lösung in diesem Fall?
InformationsquelleAutor Marcelo Calbucci
Hier ist der Fluent-API-syntax.
http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx
Wäre es nicht besser, nur um die
[NotMapped]
- Attribut?meine Antwort ist wie zu ignorieren, eine Spalte mit der Fluent-API, welche nicht mit Attributen wie [NotMapped]
Keith ist dies die bevorzugte Antwort, die ich denke, da bewegen sich jetzt auf einem code-first-standard und Walter ' s Antwort ist besser geeignet für dieses Szenario vor allem, wenn Sie am Ende mit db-Migrationen.
Wo haben Sie das entgegengesetzte problem (d.h. und EF-gebunden-Klasse, erbt von einer POCO-Klasse) war dies die einzige Möglichkeit, die ich bekommen konnte, zu arbeiten, ohne Verschmutzung der Daten-Modell mit EF.
InformationsquelleAutor Walter Stabosz
Ich nur Probleme und mein problem wurde dadurch verursacht, dass zwei Entitäten mit der
System.ComponentModel.DataAnnotations.Schema.TableAttribute
beziehen sich auf die gleiche Tabelle.Beispiel:
änderung des zweiten von
foo
zufoo_extended
wurde dieser für mich und ich bin jetzt mit Table Per Type (TPT)The entity types 'AtencionMedica' and 'AtencionMedicaAP' cannot share table 'AtencionMedicas' because they are not in the same type hierarchy
Danke, hat mir geholfen, hatte das gleiche Problem mit der fluent-API:
var entity = modelBuilder.Entity<EntityObject>().ToTable("ENTITY_TABLE")
, und dann eine weitere Linie mit der gleichenEntityObject
oder der gleichenENTITY_TABLE
.InformationsquelleAutor Seph
Einem anderen Szenario, in dem dies geschieht, ist, wenn Sie eine Basisklasse und eine oder mehrere Unterklassen, von denen mindestens einer der Unterklassen einzuführen, die zusätzliche Eigenschaften:
Wenn diese zugeordnet sind
DbContext
wie unten, die "'Ungültige Spalte name 'Diskriminator'" - Fehler tritt auf, wenn jede Art basiert aufFolder
base-Typ zugegriffen wird:Fand ich, dass, um das Problem zu beheben, extrahieren wir die Requisiten des
Folder
zu einer Basis-Klasse (die ist nicht abgebildet inOnModelCreating()
) wie soOnModelCreating
sollte unverändert:Dieser das Problem beseitigt, aber ich weiß nicht, warum!
InformationsquelleAutor meataxe
Bekomme ich die Fehlermeldung in einer anderen situation, und hier sind das problem und die Lösung:
Ich habe 2 Klassen, die von einer gleichen Basis-Klasse namens LevledItem:
Aber in Ihrer DbContext, kopierte ich einige code, aber vergessen zu ändern den Namen der Klasse:
Ja, die zweite Karte< Team> sollte Anzeigen< Geschichte>.
Und es kostete mich einen halben Tag, um es herauszufinden!
InformationsquelleAutor cheny
dieser Fehler passiert mit mir, denn ich habe die folgenden
Update Model from database
im Edmx) Umbenannt habe ich Sie manuell den Namen der Eigenschaft entsprechen der änderung in der Datenbank-schemaObwohl alle diese, bekam ich diese Fehlermeldung
so
what to do
Update Model from database
diese regenerieren Sie das Modell und entity framework
will
nichtgive you this error
hoffe, dies hilft Ihnen
InformationsquelleAutor Basheer AL-MOMANI
Ich hatte ein ähnliches problem, nicht genau die gleichen Bedingungen und dann sah ich dieser Beitrag. Hoffe, es hilft jemand. Anscheinend war ich mit einem meiner EF entity-Modellen eine Basisklasse für ein Typ war nicht angegeben als db-Satz in meinem dbcontext. Um dieses Problem zu beheben hatte ich zu schaffen, eine Basis-Klasse, die hatte alle gemeinsamen Eigenschaften der beiden Arten und Erben von der neuen Basis-Klasse zwischen den beiden Arten.
Beispiel:
InformationsquelleAutor KwakuCsc