我想存储有关公司及其制造的汽车的详细信息。理想情况下,这将包括 2 个表:Companies
和 Cars
以及外键引用。
但我想使用 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/