多对多排序
本文关键字:排序 | 更新日期: 2023-09-27 18:12:25
ASP.NET MVC4,C#。
我有两个型号A和B。他们之间有很多对很多的关系。
假设A有一个B的集合。我想对A上的B的集合进行排序,并将其持久化到数据库中。
正确的数据库设计是向桥接表A_B添加一个附加属性。然而,实体框架不允许这样做。允许在实体框架中对多对多关系进行排序的最佳解决方案是什么?
谢谢。
您必须用两个一对多关系而不是单个多对多关系来建模。这意味着您必须将桥接表作为模型中的实体公开,并且该实体将具有SortOrder
属性:
public class A_B
{
[Key, ForeignKey("A"), Column(Order = 1)]
public int AId { get; set; }
[Key, ForeignKey("B"), Column(Order = 2)]
public int BId { get; set; }
public A A { get; set; }
public B B { get; set; }
public int SortOrder { get; set; }
}
实体A
和B
不是直接相互获得集合,而是获得这个中间实体:
public class A
{
public int AId { get; set; }
public ICollection<A_B> A_Bs { get; set; }
}
public class B
{
public int BId { get; set; }
public ICollection<A_B> A_Bs { get; set; }
}
要"按排序顺序"保存关系,您可以编写例如:
var b1 = context.Bs.Find(1);
var b2 = context.Bs.Find(2);
var a = new A
{
A_Bs = new List<A_B>
{
new A_B { B = b1, SortOrder = 1 },
new A_B { B = b2, SortOrder = 2 }
}
};
context.As.Add(a);
context.SaveChanges();
现在,当您加载A
实体时,您可以按照以下排序顺序加载集合:
var a = context.As.Find(1);
a.A_Bs = context.Entry(a).Collection(x => x.A_Bs).Query()
.Include(y => y.B)
.OrderBy(y => y.SortOrder)
.ToList();
以下是如何处理这样一个在桥接表中有额外数据的模型的更多细节。