c# - 多对多排序

标签 c# entity-framework many-to-many

ASP.NET MVC4,C#。

我有两个模型 A 和 B。 它们之间存在多对多关系。

假设A有一个B的集合,我想对A上的B的集合进行排序,并将其持久化到数据库中。

为此,正确的数据库设计是向桥接表 A_B 添加一个附加属性。 但是, Entity Framework 不允许这样做。允许在 Entity Framework 中为多对多关系排序的最佳解决方案是什么?

谢谢。

最佳答案

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

实体 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; }
}

要“按排序顺序”保存关系,您可以这样写:

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

Here更多详细信息如何使用在桥接表中具有额外数​​据的模型。

关于c# - 多对多排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16388359/

相关文章:

c# - 错误 CS1061 'DbContextOptionsBuilder' 不包含定义 > 'UseSqlServer' 并且没有扩展方法 'UseSqlServer'

c# - "An entity object cannot be referenced by multiple instances of IEntityChangeTracker"

c# - 自跟踪实体 - 从导航属性中删除不会将状态设置为 'Deleted'

c# - 如何从模式优先模型在不同主机上创建数据库?

hibernate - UnsupportedOperationException 与 hibernate 和 JPA 合并保存多对多关系

c# - SSL 网络服务 : Could not create SSL/TLS secure channel

c# - 禁用 Topshelf 控制台输出

asp.net - 如何为 EF6 命名多对多表?是否需要为此添加特殊映射?

java - 多对多映射 Hibernate 出现 ConstraintViolationException

java - Java 的 Locale.ROOT 和 Locale.getDefault() 在 C# 中的等效项是什么?