【问题标题】:Conflicting changes detected. Many To many relation with additional values检测到有冲突的更改。与附加值的多对多关系
【发布时间】:2016-03-23 02:58:25
【问题描述】:

在与 Entity Framework 建立多对多关系时,我遇到了一个小问题。我尝试通过 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();

【问题讨论】:

  • 我怀疑 EF 是否支持具有自动增量功能的复合键 - 默认值为 DatabaseGeneratedOption.None,因此它将这些条目按原样发送到数据库(所有键列都设置为 default(int)=0 ),并且您会期望会发生此错误。设置键以更正不同的值或编辑键以解决此问题。
  • 对不起,我好像没关注你,你能说得具体一点吗?提前致谢!
  • 我认为您遇到了与此相同的问题:stackoverflow.com/questions/14751898/…
  • 我在那里没有得到答案,我觉得我的问题更复杂。我的猜测是实体需要一个标识符,但我没有用它,因为它只是一个关系字段

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


【解决方案1】:

您的ConnectionPointRoute 有两个列表。您是否想要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}

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 2020-05-01
    • 1970-01-01
    • 2012-03-25
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多