Используя Entity Framework, я смоделировал довольно простую схему базы данных с немного более сложной иерархией классов. В двух местах я использую наследование одной таблицы с одним столбцом дискриминатора NVARCHAR (20) NOT NULL. В одном из этих двух мест все работает отлично, никаких проблем. Но в другом месте, с почти идентичным шаблоном, я получаю следующую ошибку:
Ошибка 3023: проблема в отображении фрагментов, начинающихся со строк 371, 375, 379, 382: столбец MediaStream.MediaStreamTypeID не имеет значения по умолчанию и не имеет значения NULL. Значение столбца требуется для хранения данных объекта.
Сущность с ключом (PK) не будет в обоих направлениях, когда:
((PK НЕ играет роль MediaStream в AssociationSet 'FK_MediaStream_SessionID' ИЛИ PK НЕ находится в MediaStream EntitySet ИЛИ Тип имеет тип [SlideLinc.Model] .MediaStream) И (PK играет роль MediaStream в AssociationSet 'FK_MediaStream_SessionID' ПК НЕ находится в наборе «MediaStream» EntitySet, ИЛИ сущность имеет тип [SlideLinc.Model] .MediaStream) И (ПК играет роль MediaStream в AssociationSet «FK_MediaStream_SessionID» ИЛИ ПК находится в «MediaStream» EntitySet))
Вот определение таблицы (не включая различные индексы, внешние ключи и т. Д.):
CREATE TABLE [dbo].MediaStream(
[MediaStreamID] UNIQUEIDENTIFIER NOT NULL,
[SessionID] UNIQUEIDENTIFIER NOT NULL,
[RtmpUri] nvarchar(250) NOT NULL,
[MediaStreamTypeID] nvarchar(20) NOT NULL,
CONSTRAINT PK_MediaStream PRIMARY KEY CLUSTERED
(
[MediaStreamID] ASC
)
Я использую столбец MediaStreamtypeID в качестве дискриминатора: если он установлен на «video», должен быть создан класс VideoMediaStream, а если он установлен на «audio», должен быть создан класс AudioMediaStream.
Соответствующие части файла EDMX выглядят так:
<EntitySetMapping Name="MediaStream">
<EntityTypeMapping TypeName="IsTypeOf(SlideLinc.Model.MediaStream)">
<MappingFragment StoreEntitySet="MediaStream">
<ScalarProperty Name="RtmpUri" ColumnName="RtmpUri" />
<ScalarProperty Name="MediaStreamID" ColumnName="MediaStreamID" /></MappingFragment></EntityTypeMapping>
<EntityTypeMapping TypeName="IsTypeOf(SlideLinc.Model.VideoMediaStream)">
<MappingFragment StoreEntitySet="MediaStream" >
<ScalarProperty Name="MediaStreamID" ColumnName="MediaStreamID" />
<Condition ColumnName="MediaStreamTypeID" Value="video" /></MappingFragment></EntityTypeMapping>
<EntityTypeMapping TypeName="IsTypeOf(SlideLinc.Model.AudioMediaStream)">
<MappingFragment StoreEntitySet="MediaStream" >
<ScalarProperty Name="MediaStreamID" ColumnName="MediaStreamID" />
<Condition ColumnName="MediaStreamTypeID" Value="audio" /></MappingFragment></EntityTypeMapping></EntitySetMapping>
<AssociationSetMapping Name="FK_MediaStream_SessionID" TypeName="SlideLinc.Model.FK_MediaStream_SessionID" StoreEntitySet="MediaStream">
<EndProperty Name="MediaStream">
<ScalarProperty Name="MediaStreamID" ColumnName="MediaStreamID" /></EndProperty>
<EndProperty Name="Session">
<ScalarProperty Name="SessionID" ColumnName="SessionID" /></EndProperty></AssociationSetMapping>
Итак, в этой ошибке есть несколько вещей, которые я не получаю:
(1) Почему именно этот подход работает для моей другой иерархии классов, но не для этой? Я подумал, что это может запутать Entity Designer, поэтому я удалил эту часть моей иерархии (в XML) и пересоздал ее, но я все еще получаю ее. Я мог бы попытаться воссоздать всю эту чертову штуку, но, черт возьми, это большая работа, и если мне придется делать это очень часто, это не оставляет у меня большого вкуса в отношении структуры сущностей.
(2) На что он жалуется в первую очередь? Я не понимаю, как MediaStreamTypeID (который не является членом первичного ключа) вообще имеет какое-либо отношение к первичному ключу, или почему тот факт, что он не может быть нулевым, является проблемой (особенно учитывая, что это то же самое) установка работает в другом месте в моей модели!).
Есть какие-нибудь мысли или предложения?