检测到冲突的更改。许多与其他值的关系

时间:2016-03-22 11:06:23

标签: c# entity-framework entity-framework-6

在构建与实体框架的多对多关系时,我遇到了一些问题。我尝试通过ConnectionPointRoute在ConnectionPoint和Route之间建立多对多的关系。但是在执行数据库更新(运行种子)时,我收到消息“检测到冲突的更改。当尝试插入具有相同密钥的多个实体时,可能会发生这种情况。”我可能只是忽略了一些东西,但任何帮助表示赞赏!

public class ConnectionPoint
{
    public int ConnectionPointId { get; set; }
    public string ConnectionPointName { get; set; }
    public virtual Location Location { get; set; }
    public virtual ICollection<ConnectionPointRoute> ConnectionPointRoutes { get; set; }
    public virtual ICollection<Connection> Connections { get; set; }
}

public class Route
{
    public int RouteId { get; set; }
    public string RouteName { get; set; }
    public virtual ICollection<ConnectionPointRoute> ConnectionPointRoutes { get; set; }
}

public class ConnectionPointRoute
{
    public int ConnectionPointId { get; set; }
    public int RouteId { get; set; }
    public  int Position { get; set; }
    public virtual ICollection<ConnectionPoint> ConnectionPoints { get; set; }
    public virtual ICollection<Route> Routes { get; set; }
}
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

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

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

        modelBuilder.Entity<Route>()
            .HasMany(c => c.ConnectionPointRoutes)
            .WithRequired()
            .HasForeignKey(c => c.RouteId);
    }
        var ConnectionPointRoutes = new List<ConnectionPointRoute>
        {
            new ConnectionPointRoute { Routes = new List<Route>(), ConnectionPoints= new List<ConnectionPoint>(), Position = 1},
            new ConnectionPointRoute { Routes = new List<Route>(), ConnectionPoints= new List<ConnectionPoint>(), Position = 2},
            new ConnectionPointRoute { Routes = new List<Route>(), ConnectionPoints= new List<ConnectionPoint>(), Position = 2},
            new ConnectionPointRoute { Routes = new List<Route>(), ConnectionPoints= new List<ConnectionPoint>(), Position = 1}
        };
        ConnectionPointRoutes.ForEach(r => context.ConnectionPointRoutes.AddOrUpdate(r));
        context.SaveChanges();

1 个答案:

答案 0 :(得分:1)

您的ConnectionPointRoute有两个列表&lt;&gt;。您想要ConnectionPointConnectionPointRoute之间的多对多,以及ConnectionPointRouteRoute之间的多对多(选项#1)吗?

或者您是否尝试在ConnectionPointRoute之间进行多对多,其中ConnectionPointRoute是连接表(选项#2)?

我猜你想要选项#2。它将配置如下:

public class ConnectionPointRoute
{
    public int ConnectionPointId { get; set; }

    public int RouteId { get; set; }

    public int Position { get; set; }

    public virtual ConnectionPoint ConnectionPoint { get; set; }

    public virtual Route Route { get; set; }
}

模型构建器:

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

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

并创建:

new ConnectionPointRoute { Route = new Route(), ConnectionPoint= new ConnectionPoint(), Position = 1}
相关问题