EF Core 中修改的实体所拥有的类型属性不持久

2024-02-22

我正在尝试在 EF Core 中实现一些在 EF 6 中对我来说非常有效的目标。

我正在序列化 a 的内容List<T>属性作为数据库中的 Json 字符串。<T>几乎可以是任何东西,因为 Json.Net 负责序列化我们扔给它的任何东西。我的收藏暴露了Jsonstring 属性并负责序列化/反序列化本身。

这种方法对于结构化嵌套数据来说既方便又高效,而关系模型会带来不必要的开销和复杂性。

在 EF 6 中我会做这样的事情:

[ComplexType]
public class SelfSerializingCollection<T> : Collection<T>
{
    public void AddRange(IEnumerable<T> collection)
    {
        foreach (var item in collection)
        {
            Add(item);
        }
    }

    protected string Json
    {
        get { return JsonConvert.SerializeObject(this); }
        private set
        {
            Clear();

            if (value == null)
            {
                return;
            }

            AddRange(JsonConvert.DeserializeObject<T[]>(value));
        }
    }
}

EF 6 不支持映射泛型类型,因此我们将为我们可能需要的每种类型的 List 提供具体的实现:

public class PhoneNumberCollection : SelfSerializingCollection<PhoneNumber> { }

然后像这样使用它:

public class Contact {
    public PhoneNumberCollection PhoneNumbers { get; set; }
}

就是这样。现在,我正在尝试在 EF Core 2.0 中实现相同的目标。

这是我到目前为止所拥有的。这SelfSerializingCollection<T>类不变。

public class Contact {
    // EF Core supports generic types so we don't need a concrete implementation
    // for each collection type.
    public SelfSerializingCollection<PhoneNumber> PhoneNumbers { get; set; }
}

public class MyDbContext : DbContext
{
    // ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // EF Core does not support the [ComplexType] attribute
        // but we now have .OwnsOne() in EF Core 2
        modelBuilder.Entity<Contact>().OwnsOne(p => p.PhoneNumbers);
    }
}

到目前为止,一切都很好。 EF Core 映射PhoneNumbers_Json数据库中的列。阅读和创建新条目效果很好。

但是,与 EF 6 不同,对PhoneNumbers现有实体上的集合是not被持久化回数据库。我正在使用典型的 PUT 方法进行更新_context.Entry(contactModelFromRequestBody).State = EntityState.Modified;- 和之前一样。但由于某种原因,EF Core 没有坚持我的Json字符串属性返回数据库Modified entity.

有任何想法吗?


EF Core 将自有类型视为没有自己标识的实体类型,因此指向自有类型的属性被视为导航属性。并将父实体状态设置为Modified不级联到导航属性。

但是,那Update的方法DbContext or DbSet确实级联,所以而不是

_context.Entry(contactModelFromRequestBody).State = EntityState.Modified;

你应该使用

_context.Update(contactModelFromRequestBody);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF Core 中修改的实体所拥有的类型属性不持久 的相关文章

随机推荐