Nano Hash - криптовалюты, майнинг, программирование

Обнуляемые скалярные свойства навигации в EF 4.0: сопоставление необнуляемого столбца из отдельной таблицы базы данных со свойством обнуляемой скалярной сущности?

Используя Entity Framework версии 4.0 (или любую другую версию, совместимую с .NET 4.0), я хочу сопоставить эту существующую схему реляционной базы данных:

Схема реляционной базы данных

к этой логической объектной модели:

Логическая объектная модель

который я попытался настроить следующим образом: (Надеюсь, немецкие подписи не будут слишком дезориентировать.)

Сведения о сопоставлении Entity Framework для сущности ‹code›Foo‹/code› и настройки для ее ‹code›B‹/code  › property

Entity Framework дает мне эту ошибку:

Ошибка 3031: проблема с сопоставлением фрагментов…: ненулевой столбец FooBs.B в таблице FooBs сопоставляется со свойством объекта, допускающим значение NULL.

В логической модели B должно быть обнуляемым. Однако в базе данных его нет, поскольку он находится в отдельной таблице. (Мне нравится избегать столбцов базы данных, допускающих значение NULL.) Он становится допустимым только при объединении Foos и FooBs (из-за кардинальности 1:0..1).

Как я могу исправить свое сопоставление, не изменяя ни схему базы данных, ни объектную модель?


P.S. Я также попробовал это сопоставление кода EF 6.0:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Foo>()
    .HasKey(f => f.Id)
    .Property(f => f.Id).HasColumnName("FooId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    modelBuilder.Entity<Foo>().Map(f => {
        f.Property(_ => _.A);
        f.ToTable("Foos");
    }).Map(f => {
        f.Property(_ => _.B);
        f.ToTable("FooBs");
    });
}

Но и это не работает: при чтении из базы данных EF игнорирует все записи, для которых нет подзаписи в FooBs; при записи в базу данных он пытается вставить NULL в FooBs.B для всех Foo, для которых свойство B установлено на null.



Ответы:


1

Есть довольно "грязное" решение, которое должно работать. Это потребует некоторого изменения кода, но ваш объект Foo останется с полями A и B.

Foo класс:

class Foo {
   [Key]
   public int FooId { get; set; }
   public int A { get; set; }
   [NotMapped]
   public int? B {
      get {
         return FooB == null ? null : FooB.B;
      }
      set {
         if(value == null) {
            FooB = null;
         } else {
            if(FooB == null)
               FooB = new FooB();
            FooB.B = (int)value;
         }
   public virtual FooB FooB{ get; set; }
}

И сопоставлен с классом базы данных FooB:

 class FooB {
    [Key, ForeignKey("FooId")]
    public int FooId { get; set; }
    public int B { get; set; }
 }

С другой стороны, это кажется очень странным способом добавления в таблицу по существу одного столбца, допускающего значение NULL, поскольку нет логического способа, при котором FooB могло бы иметь более одного столбца, не допускающего значения NULL, что не привело бы к удалению всего объекта при установке столбцов. значение в ноль.

Другой вариант — создать представление базы данных, которое будет вести себя так, как вы хотите, и сопоставить его с сущностью.

20.04.2014
  • Спасибо за ответы. Вы говорите: «Есть… решение, которое должно работать». Насколько вам известно, это всего лишь одно решение или, скорее всего, единственное решение? 22.04.2014
  • В общем, это выглядит как очень странный вариант использования - могут быть и другие решения, но я не могу придумать другого. 22.04.2014
  • Спасибо. Не так уж и странно: насколько я понимаю, это просто случай нормализации базы данных, выходящий за рамки 3NF. Я ожидаю, что ORM сможет справиться с этим. Поскольку ваше решение должно работать (особенно с некоторой комбинацией partial class) и это единственный ответ, который я получил, я приму ваш ответ. Большое спасибо за ваше предложение! 22.04.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..