EF Code First「無効な列名 'Discriminator'」ですが継承はありません 質問する

EF Code First「無効な列名 'Discriminator'」ですが継承はありません 質問する

私のデータベースには SEntries というテーブルがあります (CREATE TABLE ステートメントの下を参照)。このテーブルには主キーといくつかの外部キーがありますが、特別なことは何もありません。私のデータベースにはこれに似たテーブルが多数ありますが、何らかの理由で、このテーブルには EF プロキシ クラスの「Discriminator」列が存在します。

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; }
            ...
    }

そのテーブルに新しい行を追加しようとすると、次のエラーが発生します。

System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'.

この問題は、C# クラスを別のクラスから継承している場合にのみ発生しますが、SEntry は何も継承していません (上記を参照)。

さらに、SEntries プロパティの EMData インスタンスにマウスを合わせると、デバッガーのツールヒントに次の内容が表示されます。

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...

この問題の根本原因を突き止めるための提案やアイデアはありますか? テーブルの名前、主キー、その他いくつかの変更を試みましたが、何も機能しません。

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

ベストアンサー1

Entity Framework では、派生クラスが DB に保存されない場合でも、データベース上のテーブルにマップされている POCO クラスから継承するすべてのクラスに Discriminator 列が必要であると想定されます。

[NotMapped]解決策は非常に簡単で、派生クラスの属性として追加するだけです。

例:

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

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

これで、Person クラスをデータベースの Person テーブルにマップしても、派生クラスに があるため、「Discriminator」列は作成されません[NotMapped]

追加のヒントとして、[NotMapped]DB 上のフィールドにマップしたくないプロパティを使用できます。

おすすめ記事