Entity framework core EfCore 3和Owned类型在同一个表中,如何设置Owned实例

Entity framework core EfCore 3和Owned类型在同一个表中,如何设置Owned实例,entity-framework-core,Entity Framework Core,如何使用efcore3设置拥有的类型实例 在下面的示例中,引发了一个异常 '类型为'Owned'的实体正在与共享表'Principles' 类型为“Principal”的实体,但没有具有 已标记为“已添加”的相同键值 如果我设置了子属性内联,则savechanges不会更新子属性 我找不到这方面的任何例子。我尝试了几个efcore3版本和每日版本。我不明白什么 using System; using System.Linq; using Microsoft.EntityFrameworkCore

如何使用efcore3设置拥有的类型实例

在下面的示例中,引发了一个异常

'类型为'Owned'的实体正在与共享表'Principles' 类型为“Principal”的实体,但没有具有 已标记为“已添加”的相同键值

如果我设置了子属性内联,则savechanges不会更新子属性

我找不到这方面的任何例子。我尝试了几个efcore3版本和每日版本。我不明白什么

using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;

namespace TestEF
{
  class Program
  {
    static void Main(string[] args)
    {
      var id = Guid.NewGuid();

      using (var db = new Ctx())
      {
        db.Database.EnsureDeleted();
        db.Database.EnsureCreated();

        var p = new Principal {Id = id};
        db.Principals.Add(p);
        db.SaveChanges();
      }

      using (var db = new Ctx())
      {
        var p = db.Principals.Single(o => o.Id == id);
        p.Child = new Owned();
        p.Child.Prop1 = "Test2";
        p.Child.Prop2 = "Test2";
        db.SaveChanges();
      }
    }

    public class Principal
    {
      public Guid Id { get; set; }
      public Owned Child { get; set; }
    }

    public class Owned
    {
      public string Prop1 { get; set; }
      public string Prop2 { get; set; }
    }

    public class Ctx : DbContext
    {
      public DbSet<Principal> Principals { get; set; }

      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
        optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=TestEF;Trusted_Connection=True;Persist Security Info=true");
      }

      protected override void OnModelCreating(ModelBuilder mb)
      {
        var emb = mb.Entity<Principal>();
        emb
          .OwnsOne(o => o.Child, cfg =>
          {
            cfg.Property(o => o.Prop1).HasMaxLength(30);
            //cfg.WithOwner();
          });
      }
    }
  }
}
这是一个bug,存档在

作为一种解决方法,您可以使子项显示为已修改:

db.ChangeTracker.DetectChanges();
var childEntry = db.Entry(p.Child);
childEntry.State = EntityState.Modified;
db.SaveChanges();
请尝试以下方法:

_上下文更新性

这将更新所有拥有的属性,因此SaveChanges也会更新这些属性