使用SQL Server json属性,首先使用代码EF

时间:2017-07-22 18:46:41

标签: c# asp.net sql-server json entity-framework

我想存储有关公司及其制造的汽车的详细信息。理想情况下,这将包括2个表:CompaniesCars以及外键引用。

但我希望使用SQL Server 2016的JSON和NoSQL功能。表结构将是表Companies和表中的JSON列,其中包含有关汽车的所有信息。

要通过代码优先EF实现这一点,这里是我创建的类:

public class Company
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime dtEstablished { get; set; }
    public List<Car> CarsManufactured { get; set; }
}

public class Car
{
    [Key]
    public string Name { get; set; }
    public string Model { get; set; }
    public DateTime MfgDate { get; set; }
    public string Type { get; set; }
}

并将此属性添加到ApplicationDbContext

public DbSet<Company> Companies { get; set; }

然后在应用迁移后,而不是我想要的,数据库中有2个表与外键引用一样,正如所讨论的那样。

1 个答案:

答案 0 :(得分:6)

这与使用EF的XML列相同。您必须自己序列化/反序列化列中的对象。

  

实体框架不支持本机XML数据类型。这意味着当实体映射到具有XML列的表时,XML列的等效实体属性是字符串。对象可以断开连接并序列化为XML。有关更多信息,请参阅序列化对象。

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/migration-considerations

有许多使用带有EF的XML列的例子,但你基本上需要这样的东西:

var tunnel: Option[SourceQueueWithComplete[Array[Byte]]] = None

override def receive: Receive = {
   case i: InternalMessages.InitTunnel =>
      log.info("Initializing tunnel")
      tunnel = Some(i.sourceQueue)

    case _: InternalMessages.Init =>
      sender() ! InternalMessages.Acknowledged()
      log.info("websocket stream initialized")

    case _: InternalMessages.Completed =>
      log.info("websocket stream completed")

    case q: Question => {
        tunnel match {
           case Some(t) => t offer Answer()...
           case None => log.error("No tunnel available")
        }
    }
}


object InternalMessages {
  case class Acknowledged()
  case class Init()
  case class Completed()
  case class InitTunnel(sourceQueue: SourceQueueWithComplete[Array[Byte]])
}