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

Конфликтующие параметры конфигурации с IsNullable = true IsNullable = false повторное использование ComplexType

Я не знаю, является ли это поведение преднамеренным, или это ошибка в EF6, или есть другой способ сделать это. Имея этот сложный тип:

[ComplexType]
public partial class Company    
    public bool HasValue { get { return !string.IsNullOrEmpty(this.Name); } }

    [MaxLength(100)]
    public string Name { get; set; }

    [MaxLength(20)]
    public string PhoneNumber { get; set; }

    [MaxLength(128)]
    public string EmailAddress { get; set; }
}

Я повторно использую его в этих двух объектах:

public partial class Customer
{
    public Customer ()
    {
        this.Company = new Company();       
    }

    [Key]
    public int IdCustomer { get; set; }

    [MaxLength(100)]
    [Required]
    public string FirstName { get; set; }

    [MaxLength(100)]
    [Required]
    public string LastName { get; set; }

    public Company Company { get; set; }

    public virtual AcademicInfo AcademicInfo { get; set; }
}


public partial class AcademicInfo
{       
    public AcademicInfo()
    {
        this.Organization = new Company();
    }       

    [Key, ForeignKey("Customer")]
    public int IdCustomer { get; set; }

    public Company Organization { get; set; }

    [MaxLength(100)]
    public string Subject { get; set; }

    [MaxLength(100)]
    public string Degree { get; set; }

    public virtual Customer Customer { get; set; }
}

в OnModelCreating dbcontext (EDIT: я добавил код FK, который я пропустил ранее для простоты):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{    
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    // ... Other code here related to entities not related to the problem reported omitted to avoid confusion.

    modelBuilder.Entity<AcademicInfo>()
            .HasRequired(a => a.Customer)
            .WithOptional(c => c.AcademicInfo)
            .WillCascadeOnDelete(true);

    modelBuilder.Entity<Customer>()
            .Property(p => p.Company.Name)
            .HasColumnName("CompanyName")
            .IsOptional(); // CONFLICT HERE
    modelBuilder.Entity<Customer>()
            .Property(p => p.Company.EmailAddress)
            .HasColumnName("CompanyEmailAddress")
            .IsOptional();  //CONFLICT HERE
    modelBuilder.Entity<Customer>()
            .Property(p => p.Company.PhoneNumber)
            .HasColumnName("CompanyPhoneNumber")
            .IsOptional();

    modelBuilder.Entity<AcademicInfo>()
            .Property(a => a.Organization.Name)
            .HasColumnName("OrganizationName")
            .IsRequired(); // CONFLICT
    modelBuilder.Entity<AcademicInfo>()
            .Property(a => a.Organization.EmailAddress)
            .HasColumnName("OrganizationEmail")
            .IsRequired(); // CONFLICT
    modelBuilder.Entity<AcademicInfo>()
            .Property(a => a.Organization.PhoneNumber)
            .HasColumnName("OrganizationPhone")
            .IsOptional();
}

Команда Add-Migration завершается со следующей ошибкой: Для свойства «Имя» в типе «Компания» были указаны конфликтующие параметры конфигурации: IsNullable = False конфликтует с IsNullable = True

Но это не имеет смысла, потому что я определил поля, которые не обнуляемые в таблице AcademicInfo и обнуляемые в таблице Customer.


  • HasColumnName() определяет столбец, на который будет нацелено свойство в вашей базе данных. Вы пытаетесь определить разные имена и правила, допускающие значение NULL, для одних и тех же столбцов. По умолчанию FK должен быть обнуляемым, поэтому вам нужно использовать методы HasOne() и WithOne() для необнуляемых значений. 17.11.2016
  • @james, это разные столбцы, поскольку в базе данных столбцы, допускающие значение NULL, определены в таблице Customer, а столбцы, не допускающие значения NULL, находятся в таблице AcademicInfo. В проблеме нет FK, поэтому я удалил связанный с ним код: ; 17.11.2016

Ответы:


1

Это старый вопрос, но он все еще актуален для EF версии 6.1.3.

Согласно этой проблеме, такое поведение является ограничением Entity Framework относительно того, как настроить конкретный сложный тип.

Это ограничение EF, некоторые фасеты свойств должны храниться в C-Space, а EF не позволяет настроить конкретное использование сложного типа. Таким образом, вы можете указать только разные аспекты S-Space, такие как ColumnName или ColumnType.

03.10.2017
Новые материалы

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

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

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

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

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

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

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