Saya memiliki tabel di database saya yang disebut SEntries (lihat di bawah pernyataan CREATE TABLE). Ini memiliki kunci utama, beberapa kunci asing dan tidak ada yang istimewa tentang itu. Saya memiliki banyak tabel di basis data saya yang mirip dengan yang itu, tetapi untuk beberapa alasan, tabel ini berakhir dengan kolom "Diskriminator" pada Kelas Proksi EF.
Ini adalah bagaimana kelas dideklarasikan dalam 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; }
...
}
Ketika saya mencoba menambahkan baris baru ke tabel itu, saya mendapatkan kesalahan:
System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.
Masalah ini hanya terjadi jika Anda mewarisi kelas C # Anda dari kelas lain, tetapi SEntry tidak mewarisi dari apa pun (seperti yang Anda lihat di atas).
Selain itu, setelah saya mendapatkan tool-tip pada debugger ketika saya mengarahkan mouse ke instance EMData untuk properti SEntries, ini akan menampilkan:
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...
Adakah saran atau ide untuk sampai ke bagian bawah masalah ini? Saya mencoba mengubah nama tabel, kunci utama dan beberapa hal lainnya, tetapi tidak ada yang berhasil.
SQL-Table:
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
sumber
Jawaban:
Ternyata Kerangka Entitas akan menganggap bahwa setiap kelas yang mewarisi dari kelas POCO yang dipetakan ke tabel di database membutuhkan kolom Diskriminator, bahkan jika kelas turunan tidak akan disimpan ke DB.
Solusinya cukup sederhana dan Anda hanya perlu menambahkan
[NotMapped]
sebagai atribut dari kelas turunan.Contoh:
Sekarang, bahkan jika Anda memetakan kelas Person ke tabel Person di database, kolom "Diskriminator" tidak akan dibuat karena kelas turunannya
[NotMapped]
.Sebagai kiat tambahan, Anda bisa menggunakan
[NotMapped]
properti yang tidak ingin Anda petakan ke bidang pada DB.sumber
Berikut adalah sintaks Fluent API.
http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx
sumber
[NotMapped]
atribut saja?Saya baru saja mengalami ini dan masalah saya disebabkan oleh memiliki dua entitas dengan
System.ComponentModel.DataAnnotations.Schema.TableAttribute
merujuk pada tabel yang sama.sebagai contoh:
mengubah yang kedua dari
foo
untukfoo_extended
memperbaiki ini untuk saya dan saya sekarang menggunakan Table Per Type (TPT)sumber
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")
dan kemudian baris lain menggunakan yang samaEntityObject
atau samaENTITY_TABLE
.Skenario lain di mana ini terjadi adalah ketika Anda memiliki kelas dasar dan satu atau lebih subclass, di mana setidaknya satu dari subclass memperkenalkan properti tambahan:
Jika ini dipetakan dalam
DbContext
seperti di bawah ini, kesalahan "'Nama kolom' Diskriminator '" salah terjadi ketika tipe apa pun berdasarkanFolder
tipe dasar diakses:Saya menemukan bahwa untuk memperbaiki masalah ini, kami mengekstrak alat peraga
Folder
ke kelas dasar (yang tidak dipetakanOnModelCreating()
) seperti itu -OnModelCreating
tidak boleh diubah:Ini menghilangkan masalah, tapi saya tidak tahu kenapa!
sumber
Saya mendapatkan kesalahan dalam situasi lain, dan inilah masalahnya dan solusinya:
Saya memiliki 2 kelas yang berasal dari kelas dasar yang sama bernama LevledItem:
Tetapi dalam DbContext mereka, saya menyalin beberapa kode tetapi lupa mengubah salah satu nama kelas:
Ya, Peta kedua <Tim> haruslah Peta <Cerita>. Dan saya harus membayar setengah hari untuk mengetahuinya!
sumber
Saya memiliki masalah yang sama, kondisi yang tidak persis sama dan kemudian saya melihat posting ini . Semoga ini bisa membantu seseorang. Rupanya saya menggunakan salah satu entitas entitas EF saya model kelas dasar untuk jenis yang tidak ditentukan sebagai set db dalam konteks db saya. Untuk memperbaiki masalah ini, saya harus membuat kelas dasar yang memiliki semua properti yang sama untuk dua jenis dan mewarisi dari kelas dasar baru di antara dua jenis.
Contoh:
sumber
kesalahan ini terjadi pada saya karena saya melakukan hal berikut
Update Model from database
dalam Edmx) Saya Mengganti nama secara manual Nama properti untuk mencocokkan perubahan dalam skema databaseMeskipun semua ini, saya mendapat kesalahan ini
begitu
what to do
Update Model from database
ini akan membuat ulang model, dan kerangka kerja entitas
will
tidakgive you this error
semoga ini membantu anda
sumber
Q lama, tetapi untuk anak cucu ... itu juga terjadi (.NET Core 2.1) jika Anda memiliki properti navigasi referensi-sendiri ("Induk" atau "Anak-anak" dari jenis yang sama) tetapi nama properti Id bukan yang EF berharap. Yaitu, saya memiliki properti "Id" di kelas yang saya panggil
WorkflowBase
, dan memiliki serangkaian langkah anak terkait, yang juga bertipeWorkflowBase
, dan terus mencoba mengaitkannya dengan "WorkflowBaseId" yang tidak ada (nama saya). misalkan lebih suka sebagai standar alami / konvensional). Aku harus secara eksplisit mengkonfigurasi menggunakanHasMany()
,WithOne()
danHasConstraintName()
menceritakannya bagaimana untuk melintasi. Tapi saya menghabiskan beberapa jam berpikir masalahnya ada di 'lokal' pemetaan kunci utama objek, yang saya coba untuk memperbaiki banyak cara yang berbeda tetapi yang mungkin selalu berhasil.sumber