Ошибка 3023 с использованием Entity Framework - PullRequest
4 голосов
/ 15 июня 2009

Используя 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 (который не является членом первичного ключа) вообще имеет какое-либо отношение к первичному ключу, или почему тот факт, что он не может быть нулевым, является проблемой (особенно учитывая, что это то же самое) установка работает в другом месте в моей модели!).

Есть какие-нибудь мысли или предложения?

Ответы [ 4 ]

2 голосов
/ 22 марта 2013

У меня была похожая проблема, и я смог ее решить, установив для свойства «Abstract» для базового класса значение «True» и удалив столбец дискриминатора из базового класса в модели (либо в * .edmx файл или в представлении конструктора в Visual Studio).

1 голос
/ 31 января 2015

Я получил точно такую ​​же ошибку, но, возможно, по другой причине, чем ваша. В приведенном ниже коде я неправильно скопировал некоторые коды, чтобы 2 из унаследованных классов (LeveledItem и Team) были одного и того же типа

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(new ScrumDbContextInitializer());
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<LeveledItem>()
            .Map<LeveledItem>(m => m.Requires("Type").HasValue(typeof(LeveledItem).Name))
            .Map<Team>(m => m.Requires("Type").HasValue(typeof(LeveledItem).Name))
            .Map<Story>(m => m.Requires("Type").HasValue(typeof(Story).Name))
            .Map<Task>(m => m.Requires("Type").HasValue(typeof(Task).Name))                 .Map<Sprint>(m => m.Requires("Type").HasValue(typeof(Sprint).Name));

После того, как второй был изменен на "typof (Team) .Name", ошибка была исправлена.

0 голосов
/ 19 сентября 2018

Я столкнулся с этой ошибкой, когда случайно отобразил 2 класса в одну и ту же таблицу с помощью атрибута [Table] (тот же эффект через modelBuilder ToTable ())

0 голосов
/ 18 ноября 2010

У меня была похожая проблема, просто из интереса, удаляет ли файл .EDMX и воссоздает его с нуля, ваша проблема?

Что вызвало проблему:

  1. Создан набор таблиц с некоторыми 0 .. * отображениями
  2. Сгенерировал класс Entity Framework, настроил целый набор свойств Navigation
  3. Вернулся в БД и изменил количество элементов некоторых отношений от 0 .. * до 1 .. *, т.е. установил для некоторых FK значение! Nullable
  4. Обновлен Entity Framework
  5. Перекомпилировано и БУМ Я получил ошибку компиляции, похожую на вашу

Кажется, существует проблема, когда команда «Обновить модель из базы данных» не обновляет измененные отношения правильно.

Решением было открыть файл EDMX, найти элементы <Association Name="FK_XXX_XXX">, которые были сгенерированы в первый раз, и изменить атрибут Multiplicity в соответствующей конечной точке с Multiplicity="0..1" на Multiplicity="1"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...