Сберегательный субъект с собственностью - PullRequest
0 голосов
/ 22 июня 2019

Хорошо, это может быть глупый вопрос, но я не могу понять его (пробовал искать, но безрезультатно).

У меня есть модель:

public class Freelancer
{
    public Address Address { get; set; }
    public Guid Id { get; set; }
}

public class Address
{
    public string Name1 { get; set; }
    public string Name2 { get; set; }
    public string ZipCode { get; set; }
    public string City { get; set; }
}

, который настроен следующим образом:

modelBuilder.Entity<Freelancer>().HasKey(x => x.Id);
modelBuilder.Entity<Freelancer>().OwnsOne(x => x.Address).Property(x => x.Name1).HasColumnName("AddressName1");
modelBuilder.Entity<Freelancer>().OwnsOne(x => x.Address).Property(x => x.Name2).HasColumnName("AddressName2");
modelBuilder.Entity<Freelancer>().OwnsOne(x => x.Address).Property(x => x.ZipCode).HasColumnName("AddressZipCode");
modelBuilder.Entity<Freelancer>().OwnsOne(x => x.Address).Property(x => x.City).HasColumnName("AddressCity");

и затем у меня есть метод, который пытается создать новую Freelancer сущность вместе с Address:

var address = new Address(command.Name1, command.Name2, command.ZipCode, command.City);
var freelancer = new Freelancer();
freelancer.Address = address;
_freelancerRepository.SaveOrUpdate(freelancer);
_freelancerRepository.SaveChanges();

Где SaveOrUpdate метод в основном делает то, что делает dbContext.Set<Freelancer>().Add(...). И SaveChanges делает именно то, что делает dbContext.SaveChanges().

А теперь SaveChanges выдает исключение, которое говорит:

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

Что я делаю не так?

PS.

Я тоже пробовал

modelBuilder.Entity<Freelancer>().OwnsOne(x => x.Address, a => { a.Property(...

реализация с точно такими же результатами.

Обновление: Вот мой класс dbContext:

public class DataContext : DbContext
{
    public DataContext(DbContextOptions<DataContext> options) : base(options)
    { }

    public DbSet<Freelancer> Freelancers { get; set; }
    public DbSet<Address> Addresses { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // configuration as above
    }
}

И это пользовательская SaveOrUpdate реализация:

public void SaveOrUpdate(TDatabaseObject obj)
{
    if (_context.Set<TDatabaseObject>().Any(x => x.Id == obj.Id))
    {
        _context.Update(obj);
    }
    else
    {
        _context.Add(obj);
    }
}
...