В моей базе данных есть таблица SEntries (см. Ниже оператор CREATE TABLE). У него есть первичный ключ, пара внешних ключей и ничего особенного. В моей базе данных много таблиц, похожих на эту, но по какой-то причине в этой таблице появился столбец «Дискриминатор» в прокси-классе EF.
Вот как класс объявлен в 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 не наследует ни от чего (как вы можете видеть выше).
В дополнение к этому, когда я получаю всплывающую подсказку отладчика, когда нахожу курсор мыши на экземпляр EMData для свойства SEntries, он отображает:
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
источник
Ответы:
Оказывается, что Entity Framework будет предполагать, что любой класс, который наследуется от класса POCO, который сопоставлен с таблицей в базе данных, требует столбец Discriminator, даже если производный класс не будет сохранен в БД.
Решение довольно простое, и вам просто нужно добавить его
[NotMapped]
в качестве атрибута производного класса.Пример:
Теперь, даже если вы сопоставите класс Person с таблицей Person в базе данных, столбец «Дискриминатор» не будет создан, поскольку производный класс имеет
[NotMapped]
.В качестве дополнительного совета вы можете использовать
[NotMapped]
свойства, которые вы не хотите отображать в поле в БД.источник
Вот синтаксис Fluent API.
http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx
источник
[NotMapped]
атрибут?Я только что столкнулся с этим, и моя проблема была вызвана наличием двух сущностей,
System.ComponentModel.DataAnnotations.Schema.TableAttribute
ссылающихся на одну и ту же таблицу.например:
изменение второй из
foo
кfoo_extended
исправил для меня , и я сейчас , используя таблицу для каждого типа (TPT)источник
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")
а затем другая строка, использующая то же самоеEntityObject
или то же самоеENTITY_TABLE
.Другой сценарий, в котором это происходит, - это когда у вас есть базовый класс и один или несколько подклассов, где хотя бы один из подклассов вводит дополнительные свойства:
Если они сопоставлены,
DbContext
как показано ниже, ошибка «Недопустимое имя столбца« Дискриминатор »» возникает приFolder
доступе к любому типу на основе базового типа:Я обнаружил, что для решения этой проблемы мы извлекаем реквизиты
Folder
для базового класса (который не отображаетсяOnModelCreating()
) следующим образом -OnModelCreating
должны быть неизменными:Это устраняет проблему, но я не знаю почему!
источник
Я получаю ошибку в другой ситуации, и вот проблема и решение:
У меня есть 2 класса, производные от одного базового класса с именем LevledItem:
Но в их DbContext я скопировал некоторый код, но забыл изменить одно из названий классов:
Да, вторая Карта <Команда> должна быть Карта <История>. И мне понадобилось полдня, чтобы понять это!
источник
У меня была похожая проблема, не совсем те же условия, и тогда я увидел этот пост . Надеюсь, это кому-нибудь поможет. Очевидно, я использовал одну из моих моделей сущностей EF - базовый класс для типа, который не был указан как набор БД в моем dbcontext. Чтобы решить эту проблему, мне пришлось создать базовый класс, который имел все свойства, общие для двух типов, и наследовал от нового базового класса среди двух типов.
Пример:
источник
эта ошибка произошла со мной, потому что я сделал следующее
Update Model from database
в Edmx) я переименовал вручную имя свойства, чтобы соответствовать изменению в схеме базы данныхХотя все это я получил эту ошибку
так
what to do
Update Model from database
это восстановит модель, а структура сущности
will
неgive you this error
надеюсь, это поможет вам
источник
Старый Q, но для потомков ... это также случается (.NET Core 2.1), если у вас есть самореферентное свойство навигации ("Parent" или "Children" того же типа), но имя свойства Id не то, что EF ожидает. То есть у меня в классе было свойство «Id»
WorkflowBase
, и у него был массив связанных дочерних шагов, которые также имели типWorkflowBase
, и он продолжал пытаться связать их с несуществующим «WorkflowBaseId» (имя i Предположим, что он предпочитает как естественный / обычный по умолчанию). Я должен был явным образом настроить его с помощьюHasMany()
,WithOne()
иHasConstraintName()
сказать ему , как пройти. Но я потратил несколько часов, думая, что проблема заключается в «локальном» отображении первичного ключа объекта, который я пытался исправить множеством разных способов, но который, вероятно, всегда работал.источник