【问题标题】:Using SQL Server json properties with code first EF将 SQL Server json 属性与代码优先 EF 一起使用
【发布时间】:2017-07-22 18:46:41
【问题描述】:

我想存储有关公司及其制造的汽车的详细信息。理想情况下,这将包括 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 个具有外键引用的表,而不是我想要的。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    有很多关于在 EF 中使用 XML 列的示例,但您基本上需要以下内容:

    using Newtonsoft.Json;
    using System;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.IO;
    using System.Linq;
    
    namespace ConsoleApp6
    {
    
        public class Company
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public DateTime dtEstablished { get; set; }
    
            [NotMapped]
            public Car[] CarsManufactured
            {
                get
                {
                    var ser = new JsonSerializer();
                    var jr = new JsonTextReader(new StringReader(CarsManufacturedJSON));
    
                    return ser.Deserialize<Car[]>(jr);
                }
                set
                {
                    var ser = new JsonSerializer();
                    var sw = new StringWriter();
                    ser.Serialize(sw,value);
                    CarsManufacturedJSON = sw.ToString();
                }
            }
    
            [Column("CarsManufactured")]
            public string CarsManufacturedJSON { get; set; }
    
    
        }
    
        public class Car
        {
    
            public string Name { get; set; }
            public string Model { get; set; }
            public DateTime MfgDate { get; set; }
            public string Type { get; set; }
        }
        class Db: DbContext
        {
            public DbSet<Company> Companies { get; set; }
    
        }
        class Program
        {
    
            static void Main(string[] args)
            {
                Database.SetInitializer(new DropCreateDatabaseAlways<Db>());
    
                using (var db = new Db())
                {
                    db.Database.Log = m => Console.WriteLine(m);
    
                    var company = db.Companies.Create();
                    company.Name = "Acme";
                    company.dtEstablished = new DateTime(2000, 2, 2);
    
                    var cars = new Car[5];
                    for (int i = 0; i<cars.Length; i++)
                    {
                        var c = new Car()
                        {
                            MfgDate = new DateTime(2010 + i, 1, 1),
                            Model = $"Model{i}",
                            Name = $"ModelName{i}",
                            Type = $"Type{i}"
    
                        };
                        cars[i] = c;
                    }
    
                    company.CarsManufactured = cars;
    
                    db.Companies.Add(company);
                    db.SaveChanges();
    
                }
                using (var db = new Db())
                {
                    var company = db.Companies.First();
                    Console.WriteLine(company.CarsManufacturedJSON);
    
                }
                Console.ReadKey();
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      相关资源
      最近更新 更多