Entity Framework 6 Зависимое свойство в ReferentialConstraint сопоставляется столбцу, сгенерированному хранилищем. Ошибка

#entity-framework #entity-framework-6

#entity-framework #entity-framework-6

Вопрос:

У меня есть 2 объекта, настроенные с помощью Entity Framework 6. Оба объекта имеют идентификатор для генерации первичных ключей при вставке.

Когда я пытаюсь добавить нового клиента, я получаю следующую ошибку.
A dependent property in a ReferentialConstraint is mapped to a store-generated column. Column: 'Id'.

Мое предположение заключается в том, что я неправильно настроил одну из сущностей для взаимно однозначных отношений.

 public class Customer : IdEntity
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Guid? BalanceId { get; set; }
        public DateTime? Dob { get; set; }
        public DateTime CreateDate { get; set; }

        public CustomerBalance Balance { get; set; }
        public Address Address { get; set; }

        public virtual ICollection<Email> Emails { get; set; } = new List<Email>();
        public virtual ICollection<Phone> Phones { get; set; } = new List<Phone>();
        public virtual ICollection<Reward> Rewards { get; set; }
        public ICollection<Call> Calls { get; set; }
    }
 

Вот сопоставление для клиента

 public class CustomerConfiguration : EntityTypeConfiguration<Customer>
    {
        public CustomerConfiguration()
        {
            ToTable(nameof(Customer));
            HasKey(x => x.Id).Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            HasMany(x => x.Phones);
            HasMany(x => x.Emails);
            HasOptional(x => x.Balance);
 HasRequired(x => x.Address).WithRequiredDependent(x=>x.Customer);
        }

    }
 

Здесь объект адреса

 public class Address : IdEntity
    {
        public string Address1 { get; set; }
        public string Address2 { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
        public string Country { get; set; }
        public int CustomerId { get; set; }

        public virtual Customer Customer { get; set; }
    }
 

И картографирование

  public class AddressConfiguration : EntityTypeConfiguration<Address>
    {
        public AddressConfiguration()
        {
            ToTable(nameof(Address));
            HasKey(x => x.Id, e => e.IsClustered())
                .Property(x => x.Id)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        }
    }
 

Вот код, как я вставляю нового клиента

  var customer = new Customer
            {
                FirstName = request.FirstName,
                LastName = request.LastName,
                CreateDate = DateTime.Now,
                Address = new Address()
            };
            if (!string.IsNullOrEmpty(request.Email))
                customer.Emails.Add(new Email { EmailName = request.Email, IsPrimary = true });
            if (!string.IsNullOrEmpty(request.Phone))
                customer.Phones.Add(new Phone { Number = request.Phone, IsPrimary = true });

            _repository.AddOneAsync(customer);
            await _repository.Context.SaveChangesAsync();

 

Ошибка возникает при сохранении изменений.
Адрес и клиент связаны один к одному.

Вот как мои таблицы настраиваются в SQL

https://ibb.co/cYYphbJ

https://ibb.co/LnXcsyB

Ответ №1:

Отношения «один к одному» в EF6 должны использовать одни и те же ключи. НАПРИМЕР, адрес.CustomerID должен быть его ключом.

Либо разрешить клиентам иметь несколько адресов в модели, либо изменить ключ адреса на CustomerID .

Комментарии:

1. Спасибо. Это сработало. Мне пришлось переместить AddressID в объект Customer или разрешить несколько адресов. имеет смысл. Спасибо вам1