多对多排序

Fie*_*nix 1 c# many-to-many entity-framework

ASP.NET MVC4,C#.

我有两个模型A和B.它们之间有很多对多的关系.

假设A有一个B的集合.我想在A上对B的集合进行排序并将其保存在数据库中.

正确的数据库设计是为桥接表A_B添加一个额外的属性.但是,实体框架不允许这样做.允许在实体框架中对多对多关系进行排序的最佳解决方案是什么?

谢谢.

Sla*_*uma 7

您必须使用两个一对多关系而不是一个多对多关系对此进行建模.这意味着您必须将桥接表作为模型中的实体公开,并且此实体将具有以下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; }
}
Run Code Online (Sandbox Code Playgroud)

实体AB集合不是直接相互之间,而是与此中间实体相关:

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; }
}
Run Code Online (Sandbox Code Playgroud)

要以"按排序顺序"保存关系,您可以编写例如:

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();
Run Code Online (Sandbox Code Playgroud)

现在,当您加载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();
Run Code Online (Sandbox Code Playgroud)

以下是有关如何使用桥接表中包含其他数据的此类模型的更多详细信息.