【问题标题】:Add a one-to-many connection to Many-to-Many将一对多连接添加到多对多
【发布时间】:2016-05-20 12:21:44
【问题描述】:

我与一些附加字段存在多对多关系。但是由于在多对多关系中添加了可能适用于其他关系的照片,因此我想将其分开,因此我可以通过更改一对多关系来更改它。这是模型

public class Segment
{
    public int SegmentId { get; set; }
    public int ConnectionPointIdEnd { get; set; }
    public string ConnectionName { get; set; }
    public string ConnectionInformation { get; set; }
    public string Image { get; set; }
    public string Direction { get; set; }
    public ICollection<ConnectionPointRoute> ConnectionPointRoutes { get; set; }
}
public class ConnectionPointRoute
{
    public int ConnectionPointId { get; set; }
    public int RouteId { get; set; }
    public int SegmentId { get; set; }
    public  int Position { get; set; }
    public ConnectionPoint ConnectionPoint { get; set; }
    public Route Route { get; set; }
    public Segment Segment { get; set; }
}

模型构建器看起来像这样:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ConnectionPointRoute>()
            .HasKey(c => new { c.ConnectionPointId, c.RouteId, c.SegmentId });

        modelBuilder.Entity<ConnectionPoint>()
            .HasMany(c => c.ConnectionPointRoutes)
            .WithRequired(x => x.ConnectionPoint)
            .HasForeignKey(c => c.ConnectionPointId);

        modelBuilder.Entity<Route>()
            .HasMany(c => c.ConnectionPointRoutes)
            .WithRequired(x => x.Route)
            .HasForeignKey(c => c.RouteId);

        modelBuilder.Entity<Segment>()
            .HasMany(c => c.ConnectionPointRoutes)
            .WithRequired(x => x.Segment)
            .HasForeignKey(c => c.SegmentId);
    }

这一切都适用于获取项目,但由于某种原因,它不允许我发布新路线,例如,它给我错误:

"违反了多重性约束。角色 关系的“Segment_ConnectionPointRoutes_Source” 'InBuildingNavigator.Data.Models.Segment_ConnectionPointRoutes' 有 多重性 1 或 0..1。”

有什么想法吗?

【问题讨论】:

    标签: c# asp.net entity-framework post asp.net-identity


    【解决方案1】:

    解决了这个问题!我的 Post 代码中有一个错误,我添加了完整的子对象,这在我的情况下没有多大意义。

    如果您需要更详细的修复,请询问我!

    【讨论】:

      【解决方案2】:

      还有两件事:

      1. 我建议您为多对多关系使用一个额外的对象(如果您还没有这样做的话)。这将使您能够更好地控制表名称和您可能想要做的选择。
      2. 为您的属性使用 virtual 关键字,您不需要直接(对于您的集合) - 这将允许 ef 在它们上实现延迟加载。

      【讨论】:

      • 我选择使用显式加载,因为我想对数据进行严格控制。我必须说我不能真正遵循您的第一个建议,需要解释一下吗?
      • 这是我自己的经验。例如:我有一个用户有朋友关系 - 一个经典的多对多关系。此关系还有另一个属性,即friendStatus(已确认友谊)。当我想得到所有公认的朋友时,这在使用 asp.net 身份时往往很困难。不要误会我,自动 ef 的方式做多对多的效果很好,我只是经历过它往往很难在以后定制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      相关资源
      最近更新 更多