在构建与实体框架的多对多关系时,我遇到了一些问题。我尝试通过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();
答案 0 :(得分:1)
您的ConnectionPointRoute
有两个列表&lt;&gt;。您想要ConnectionPoint
和ConnectionPointRoute
之间的多对多,以及ConnectionPointRoute
和Route
之间的多对多(选项#1)吗?
或者您是否尝试在ConnectionPoint
和Route
之间进行多对多,其中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}