c# - 将 SQL Server json 属性与代码优先 EF 一起使用

标签 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 个外键引用的表,而不是我想要的。

最佳答案

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

The Entity Framework does not support a native-XML data type. This means that when an entity is mapped to a table with an XML column, the equivalent entity property for the XML column is a string. Objects can be disconnected and serialized as XML. For more information, see Serializing Objects.

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

有很多将 XML 列与 EF 结合使用的示例,但您基本上需要这样的东西:

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();

        }
    }
}

关于c# - 将 SQL Server json 属性与代码优先 EF 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45258029/

相关文章:

c# - 为什么 C# 中的 sizeof(bool) == sizeof(byte)?

c# - Stream.Dispose 是否总是调用 Stream.Close(和 Stream.Flush)

c# - 分发需要 Microsoft.Office.Interop.Excel 的应用程序

jquery - 无效的 Web 服务调用,缺少参数值

sql - 如何查看事件的 SQL Server 连接?

php - 如何在yii中保存之前检查sql查询

javascript - 使用 jQuery 将无序列表所选项目传递到 ASP.NET Web 窗体

asp.net - 为什么我的 asp.net mvc 应用程序在我检查 Fiddler 时要求 .map 文件

c# - 静态 HTML 控件与 razor html 助手

sql-server - 使用 "Latest record of group"选择在 View 上创建索引