使用实体框架C#asp.net创建复杂的Json
本文关键字:创建 复杂 Json net C#asp 实体 框架 | 更新日期: 2023-09-27 17:59:27
我有两个表:
产品
ProductId | ProductName
__________|____________
1 | iPhone5
2 | iPhone6
3 | iPhone6s
图像
Id | ImagePath | ProductId
___|__________________|___________
1 | /images/231.jpg | 2
2 | /images/432.jpg | 2
3 | /images/111.jpg | 1
我想让Json看起来像
{
"id":"2",
"ProductName":"iPhone6"
},
"Images":[
{
"Id":"1",
"ImagePath":"/images/231.jpg"
},
{
"Id":"2",
"ImagePath":"/images/432.jpg"
}
]
所以我想使用实体框架获得每个产品的所有图像。我尝试使用join:
var ads = db.Products.
Join(db.Images,
x=>x.ProductId,
cm=>cm.ProductId,
(x ,cm) => new {
Ads = x,
Images = cm
}).
Select(d => new {
d.Ads.AdId,
d.Images.ImagePath,
}).
Where(x => x.ProductId== 2).
ToList();
还有我的Json
[
{
"AdId":2,
"ImagePath":"/images/231.jpg"
},
{
"AdId":2,
"ImagePath":"/images/432.jpg"
}
]
我的产品和图像模型:
public class Product{
public int ProductId { get; set; }
public string ProductName { get; set; }
public virtual ICollection<Image> Images { get; set; }
}
public class Image{
public int ImageId { get; set; }
public string ImagePath { get; set; }
public int ProductId { get; set; }
public virtual Product Product { get; set; }
}
您可以显式地为Product
和Image
之间的one-to-many
关系建模,如下所示:
public class ProductConfig : EntityTypeConfiguration<Product>
{
public ProductConfig()
{
HasMany(p => p.Images).WithRequired(i => i.Product).HasForeignKey(i => i.ProductId);
}
}
并在DbContext
中添加此配置,如下所示:
public class MyDbContext:DbContext
{
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ProductConfig());
}
}
一旦关系被正确建模,那么你就可以使用:
var prod = myDbContext.Products.Find(2);
或
var prod = myDbContext.Products.SingleOrDefault(p => p.ProductId == 2);
或
var prod = myDbContext.Products.Where(p => p.Id == 2);
以获得产品并简单地序列化如下:
var iPhone6Json = JsonConvert.SerializeObject(iPhone6, Formatting.Indented);
关联的Images
将在序列化期间加载,因为它们被标记为虚拟。您不需要执行和显式联接。这里的关键是,在处理DbContext
实例之前,您需要序列化,否则延迟加载的功能可能无法工作,并且您可能会面临一些不希望出现的错误。
您还可以将Image
中的Product
属性标记为JsonIgnore
,以将其从序列化中排除并避免引用循环。
[JsonIgnore]
public int ProductId { get; set; }
[JsonIgnore]
public Product Product { get; set; }
那么你应该拥有的JSON
如下:
{
"id":"2",
"ProductName":"iPhone6",
"Images":[
{
"Id":"1",
"ImagePath":"/images/231.jpg"
},
{
"Id":"2",
"ImagePath":"/images/432.jpg"
}
]
}
我认为这也符合你的目的。
希望能有所帮助。