Ich habe eine Tabelle in meiner Datenbank mit dem Namen SEntries (siehe unten die Anweisung CREATE TABLE). Es hat einen Primärschlüssel, ein paar Fremdschlüssel und nichts Besonderes. Ich habe viele Tabellen in meiner Datenbank, die dieser ähnlich sind, aber aus irgendeinem Grund endete diese Tabelle mit einer Spalte "Diskriminator" in der EF-Proxy-Klasse.
So wird die Klasse in C # deklariert:
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, dieser Tabelle eine neue Zeile hinzuzufügen, wird folgende Fehlermeldung angezeigt:
System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.
Dieses Problem tritt nur auf, wenn Sie Ihre C # -Klasse von einer anderen Klasse erben, SEntry jedoch nichts erbt (wie Sie oben sehen können).
Sobald ich den Tooltip zum Debugger erhalte, wenn ich mit der Maus über die EMData-Instanz für die SEntries-Eigenschaft fahre, wird außerdem Folgendes angezeigt:
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 Sie dieser Ausgabe auf den Grund gehen können? Ich habe versucht, die Tabelle, den Primärschlüssel und einige andere Dinge umzubenennen, 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
quelle
Antworten:
Es stellt sich heraus, dass Entity Framework davon ausgeht, dass für jede Klasse, die von einer POCO-Klasse erbt, die einer Tabelle in der Datenbank zugeordnet ist, eine Diskriminatorspalte erforderlich ist, auch wenn die abgeleitete Klasse nicht in der Datenbank gespeichert wird.
Die Lösung ist recht einfach und Sie müssen nur
[NotMapped]
ein Attribut der abgeleiteten Klasse hinzufügen .Beispiel:
Selbst wenn Sie die Person-Klasse der Person-Tabelle in der Datenbank zuordnen, wird jetzt keine Spalte "Diskriminator" erstellt, da die abgeleitete Klasse dies hat
[NotMapped]
.Als zusätzlichen Tipp können Sie
[NotMapped]
Eigenschaften verwenden, die Sie keinem Feld in der Datenbank zuordnen möchten.quelle
Hier ist die Fluent API-Syntax.
http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx
quelle
[NotMapped]
Attribut hinzuzufügen ?Ich bin gerade darauf gestoßen, und mein Problem wurde dadurch verursacht, dass zwei Entitäten beide
System.ComponentModel.DataAnnotations.Schema.TableAttribute
auf dieselbe Tabelle verweisen.beispielsweise:
Wenn ich den zweiten von
foo
auffoo_extended
ändere, wird dies für mich behoben und ich verwende jetzt Table Per Type (TPT).quelle
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")
und dann eine andere Zeile mit der gleichenEntityObject
oder der gleichenENTITY_TABLE
.Ein anderes Szenario, in dem dies auftritt, ist, wenn Sie eine Basisklasse und eine oder mehrere Unterklassen haben, wobei mindestens eine der Unterklassen zusätzliche Eigenschaften einführt:
Wenn diese
DbContext
wieFolder
folgt zugeordnet sind, tritt der Fehler "'Ungültiger Spaltenname' Diskriminator '" auf, wenn auf einen Typ zugegriffen wird, der auf dem Basistyp basiert:Ich fand, dass wir, um das Problem zu beheben, die Requisiten
Folder
einer Basisklasse (die nicht zugeordnet istOnModelCreating()
) wie folgt extrahieren -OnModelCreating
sollte unverändert bleiben:Dies beseitigt das Problem, aber ich weiß nicht warum!
quelle
Ich erhalte den Fehler in einer anderen Situation und hier sind das Problem und die Lösung:
Ich habe 2 Klassen, die von derselben Basisklasse namens LevledItem abgeleitet sind:
Aber in ihrem DbContext habe ich einen Code kopiert, aber vergessen, einen der Klassennamen zu ändern:
Ja, die zweite Karte <Team> sollte Karte <Story> sein. Und es hat mich einen halben Tag gekostet, es herauszufinden!
quelle
Ich hatte ein ähnliches Problem, nicht genau die gleichen Bedingungen und dann habe ich diesen Beitrag gesehen . Hoffe es hilft jemandem. Anscheinend habe ich eines meiner EF-Entitätsmodelle als Basisklasse für einen Typ verwendet, der in meinem Datenbankkontext nicht als Datenbanksatz angegeben wurde. Um dieses Problem zu beheben, musste ich eine Basisklasse erstellen, die alle Eigenschaften der beiden Typen gemeinsam hatte und von der neuen Basisklasse zwischen den beiden Typen erbte.
Beispiel:
quelle
Dieser Fehler tritt bei mir auf, weil ich Folgendes getan habe
Update Model from database
in Edmx ) Ich habe den Eigenschaftsnamen manuell umbenannt, um ihn an die Änderung im Datenbankschema anzupassenTrotz alledem habe ich diesen Fehler bekommen
so
what to do
Update Model from database
Dadurch wird das Modell neu generiert und das Entity-Framework
will
nichtgive you this error
hoffe das hilft dir
quelle
Altes Q, aber für die Nachwelt ... es kommt auch vor (.NET Core 2.1), wenn Sie eine selbstreferenzierende Navigationseigenschaft ("Parent" oder "Children" desselben Typs) haben, der Name der Id-Eigenschaft jedoch nicht EF erwartet. Das heißt, ich hatte eine "Id" -Eigenschaft in meiner Klasse mit dem Namen
WorkflowBase
und es gab eine Reihe verwandter untergeordneter Schritte, die ebenfalls vom Typ warenWorkflowBase
, und es wurde immer wieder versucht, sie einer nicht vorhandenen "WorkflowBaseId" (dem Namen i) zuzuordnen Angenommen, es wird als natürlicher / konventioneller Standard bevorzugt. Ich hatte ausdrücklich zu konfigurieren , es zu benutzenHasMany()
,WithOne()
undHasConstraintName()
ihm zu sagen , wie zu verfahren. Aber ich habe ein paar Stunden damit verbracht zu denken, dass das Problem darin besteht, den Primärschlüssel des Objekts 'lokal' zuzuordnen, was ich versucht habe, auf verschiedene Arten zu beheben, aber wahrscheinlich immer funktioniert hat.quelle