【问题标题】:EntityFramework and writing 3rd party types to DBEntityFramework 并将第 3 方类型写入数据库
【发布时间】:2017-10-07 15:59:29
【问题描述】:

我正在尝试使用实体框架将类写入数据库。

public class MyClass
{
    [Key]
    public long ID {get; set;}

    public Type MyType {get;set;}
}

我的 DbContext 包含 MyClass 的 DbSet,但是当我尝试创建数据库时,
我得到了这个例外:

System.InvalidOperationException: '实体类型 'CustomAttributeData' 需要定义一个主键。'

我猜是因为 EF 试图使用 System.Type 的内部结构。

有没有办法让 EF 将此字段(或我们无法更改的任何其他类)写入数据库?

【问题讨论】:

  • 但是它应该如何被序列化到数据库中呢?这应该在您的数据库中是什么类型的字段?
  • @Pac0:二进制格式。
  • 请问您的目标是什么?你想实现什么功能?
  • @Pac0:我不知道类中还会添加哪些其他属性。我不想像这样将每个属性序列化为 JSON。

标签: c# entity-framework


【解决方案1】:

为什么要序列化类型本身?我认为存储它的全名就足够了:

使用 NotMapped 属性忽略 MyType 属性并序列化类型名称而不是类型本身 (MyType.FullName) 并使用 Type.GetType() 重新创建它。

注意:对于复杂的自定义类型,可以找到优雅的解决方案here

[编辑] 由于Type实际上可能是一个自定义的复杂类型,一个可能的解决方案是使用JsonConvert.SerializeObjectJsonConvert.DeserializeObject来获取可以直接存储到数据库中的常规字符串。

【讨论】:

  • 好的,但不仅仅是那个属性。还会有其他“复杂”的属性。 (顺便说一句 - 类型不是那个对象的类型......它是别的东西)
  • @Idov - 然后看一下建议的解决方案,它基本上使用 Json.NET 来序列化和反序列化复杂对象到字符串表示形式和从字符串表示形式输出。您还应该将 Type(又名 System.Type)替换为 CustomType 或类似名称以避免混淆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
相关资源
最近更新 更多