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