拥有财产的储蓄实体

时间:2019-06-21 21:03:46

标签: c# entity-framework-core ef-core-2.2

好的,这可能是一个愚蠢的问题,但我无法弄清楚(尝试搜索但没有任何合理的效果)。

我有一个模特:

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);
    }
}

0 个答案:

没有答案