Обновление EF Core 2.1 приводит к созданию записи в связанной таблице - PullRequest
0 голосов
/ 28 августа 2018

У меня есть таблица адресов и таблица состояний в моей базе данных. Когда я вызываю update для записи адреса в EF Core, я предоставляю Id для существующей записи State. По какой-то причине запрос вставляет новую запись в таблицу состояний вместо поиска существующей записи. У меня есть мой код ниже.

Это код уровня сервиса, который вызывает доступ к данным:

public int UpsertContactInfo(ContactInfo contactInfo)
        {
var mailingAddress = new AddressEntity() {
            AddressLine1 = contactInfo.mailingAddressLine1,
            AddressLine2 = contactInfo.mailingAddressLine2,
            City = contactInfo.mailingCity,
            ZipCode = contactInfo.mailingZip,
            Id = contactInfo.mailingAddressId,
            State = new StateEntity(){
                Id = contactInfo.mailingStateId
            }
            };
_addressDataAccess.UpdateAddress(mailingAddress);

и вот мой доступ к данным:

public int UpdateAddress(AddressEntity address)
        {
            _context.Addresses.Attach(address);
            _context.SaveChanges();
            return (int)address.Id;
        }

ContactInfo:

using System;

namespace LandHawk.DataAccess.Entity
{
    public class ContactInfoEntity
    {
        public int Id { get; set; }
        public int PrimaryAddressId { get; set; }
        public AddressEntity PrimaryAddress { get; set; }
        public int MailingAddressId { get; set; }
        public AddressEntity MailingAddress { get; set; }
    }
}

Состояние:

using System;

namespace LandHawk.DataAccess.Entity
{
    public class StateEntity
    {
        public int Id { get; set; } 
        public string Name { get; set; }    
        public string Abbreviation { get; set; }    
    }
}

Никаких специальных карт не делается. в моей базе данных текст:

    public class DatabaseContext : DbContext
    {
        public DbSet<AddressEntity> Addresses { get; set; }
        public DbSet<StateEntity> States { get; set; }
...        
protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<StateEntity>();

            modelBuilder.Entity<AddressEntity>()
                .Property(a => a.Id)
                .ValueGeneratedOnAdd();

Идентификатор адреса определенно равен 1, что соответствует существующей записи в таблице состояний в БД. однако при совершении вызова создается новая запись состояния.

...