gpt4 book ai didi

c# - EF Core 中已修改实体的自有类型属性不持久

转载 作者:太空狗 更新时间:2023-10-30 00:23:00 26 4
gpt4 key购买 nike

我正在尝试在 EF Core 中实现一些在 EF 6 中非常适合我的东西。

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

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

在 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 不支持映射泛型类型,因此我们将为我们可能需要的每种类型的列表提供具体实现:

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 的任何更改现有实体上的集合不会被保存回数据库。我正在使用 _context.Entry(contactModelFromRequestBody).State = EntityState.Modified; 在典型的 PUT 方法中进行更新- 和之前一样。但出于某种原因,EF Core 没有坚持我的 Json Modified 的字符串属性返回到数据库实体。

有什么想法吗?

最佳答案

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

但是 DbContextDbSetUpdate 方法会级联,所以不是

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

你应该使用

_context.Update(contactModelFromRequestBody);

关于c# - EF Core 中已修改实体的自有类型属性不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46872428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com