EfCore 3和“拥有的类型”在同一张表中,如何设置拥有的实例

时间:2019-08-23 15:00:35

标签: entity-framework-core

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

在以下示例中,引发了异常

  

“类型为“拥有”的实体与以下用户共享表“ Principals”   '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();
          });
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

这是一个错误,已提交到https://github.com/aspnet/EntityFrameworkCore/issues/17422

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

LENGTH(TRIM(BOTH FROM STAFF_NO)) AS STAFF_NO_LENGTH

答案 1 :(得分:0)

尝试以下方法:

_context.Update(entity);

这将更新所有拥有的属性,因此SaveChanges()也将更新它们。