为多对多添加一对多连接

时间:2016-05-20 12:21:44

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

我与其他一些字段有很多关系。但是因为有很多关系可以应用于其他关系的照片,我想分开它,所以我可以通过改变一对多的关系来改变它。这是模型

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。“

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

问我是否需要更详细的解决方法!

答案 1 :(得分:0)

还有两件事:

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