Хорошо, это может быть глупый вопрос, но я не могу понять его (пробовал искать, но безрезультатно).
У меня есть модель:
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);
}
}