EF Code First "Invalid column name 'Discriminator'" but no inheritance

ef-code-first, entity-framework

Solution

Turns out that Entity Framework will assume that any class that inherits from a POCO class that is mapped to a table on the database requires a Discriminator column, even if the derived class will not be saved to the DB.

The solution is quite simple and you just need to add `[NotMapped]` as an attribute of the derived class.

Example:

class Person
{
    public string Name { get; set; }
}

[NotMapped]
class PersonViewModel : Person
{
    public bool UpdateProfile { get; set; }
}

Now, even if you map the Person class to the Person table on the database, a "Discriminator" column will not be created because the derived class has `[NotMapped]`.

As an additional tip, you can use `[NotMapped]` to properties you don't want to map to a field on the DB.

Problem

I have a table in my database called SEntries (see below the CREATE TABLE statement). It has a primary key, a couple of foreign keys and nothing special about it. I have many tables in my database similar to that one, but for some reason, this table ended up with a "Discriminator" column on the EF Proxy Class. This is how the class is declared 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; } ... } ``` When I try to add a new row to that table, I get the error: ``` System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'. ``` This problem only occurs if you are inheriting your C# class from another class, but SEntry is not inheriting from anything (as you can see above). In addition to that, once I get the tool-tip on the debugger when I mouse over the EMData instance for the SEntries property, it displays: ``` 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... ``` Any suggestions or ideas where to get to the bottom of this issue? I tried renaming the table, the primary key and a few other things, but nothing works. 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 ```

Original source