好的,这可能是一个愚蠢的问题,但我无法弄清楚(尝试搜索但没有任何合理的效果)。
我有一个模特:
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);
}
}