EF 多对多将记录插入 Main table 以及加入 table
EF Many to Many Inserting Records into Main table as well as join table
我遇到了多对多关系和插入数据的奇怪情况。
Table 1(地区):
public class Region
{
public Region()
{
SessionList = new List<Session>();
UserProfileList = new List<UserProfile>();
LeagueEventList = new List<LeagueEvent>();
}
public int RegionId { get; set; }
public string RegionName { get; set; }
public virtual ICollection<Session> SessionList { get; set; }
public virtual ICollection<UserProfile> UserProfileList { get; set; }
public virtual ICollection<LeagueEvent> LeagueEventList { get; set; }
}
区域 Table 的配置文件:
public class RegionConfig : EntityTypeConfiguration<Region>
{
public RegionConfig()
{
HasKey<int>(r => r.RegionId);
Property(r => r.RegionId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
对于 Table 2(LeagueEvent),我们有以下内容:
public class LeagueEvent
{
public LeagueEvent()
{
LeagueEventDetails = new List<LeagueEventDetail>();
RegionIds = new List<Region>();
LeagueEventRegistrations = new List<LeagueEventRegistration>();
}
public int EventId { get; set; }
public int VenueId { get; set; }
public virtual Venue venue { get; set; }
public virtual ICollection<LeagueEventDetail> LeagueEventDetails { get; set; }
public virtual ICollection<Region> RegionIds { get; set; }
public virtual ICollection<LeagueEventRegistration> LeagueEventRegistrations { get; set; }
}
使用以下配置文件:
public class LeagueEventConfig : EntityTypeConfiguration<LeagueEvent>
{
public LeagueEventConfig()
{
HasKey<int>(e => e.EventId);
Property(e => e.EventId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(u => u.venue).WithMany(w => w.LeagueEventList).HasForeignKey(f=> f.VenueId).WillCascadeOnDelete(false);
HasMany<Region>(r => r.RegionIds).WithMany(e => e.LeagueEventList).Map(ler =>
{
ler.MapLeftKey("EventId");
ler.MapRightKey("RegionId");
ler.ToTable("EventRegion");
});
}
}
发生的事情是在尝试插入一个可以跨越多个区域的联盟事件时发生的,这就是为什么我有 RegionIds 实体在插入和保存之前显示正确的 RegionId 值。但是,在插入并检查 tables 后,它显示:
在 LeagueEvent 中正确创建新记录
在 EventRegion 中创建的新记录具有正确的 EventId,但具有新的 RegionId
在区域 table 中创建了 RegionName 值重复的新记录。
除非我误解了,否则永远不应该从联盟赛事插入中在地区创建新记录。我是不是误解了 fluent handles join tables 的方式?
更新
我删除了 .map 命令并以这种方式对其进行了测试。 EF 继续并创建了 table,但同样的问题不断发生。
现在我手动创建了 EventRegion table 并更新了 Events 和 Regions ICollections 以指向那个 table。现在它正在插入具有来自区域 table 的正确值但来自事件 table 的 0 值的记录。它也不会像以前那样将记录插入区域 table。
似乎正在发生的事情是集合中的 EventRegion 记录被插入到实际事件之前,因此 EventRegion 中 EventId 的值为 0。
虽然很奇怪,但我原以为会产生错误。如果您需要更新的任何代码片段,请告诉我。
如有任何帮助,我们将不胜感激。
谢谢,
克里斯
因为我一直找不到解决办法。我删除了 .map 语句,然后手动创建了连接 table。现在一切都按预期进行。如果能找出问题就好了。
我遇到了多对多关系和插入数据的奇怪情况。 Table 1(地区):
public class Region
{
public Region()
{
SessionList = new List<Session>();
UserProfileList = new List<UserProfile>();
LeagueEventList = new List<LeagueEvent>();
}
public int RegionId { get; set; }
public string RegionName { get; set; }
public virtual ICollection<Session> SessionList { get; set; }
public virtual ICollection<UserProfile> UserProfileList { get; set; }
public virtual ICollection<LeagueEvent> LeagueEventList { get; set; }
}
区域 Table 的配置文件:
public class RegionConfig : EntityTypeConfiguration<Region>
{
public RegionConfig()
{
HasKey<int>(r => r.RegionId);
Property(r => r.RegionId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
对于 Table 2(LeagueEvent),我们有以下内容:
public class LeagueEvent
{
public LeagueEvent()
{
LeagueEventDetails = new List<LeagueEventDetail>();
RegionIds = new List<Region>();
LeagueEventRegistrations = new List<LeagueEventRegistration>();
}
public int EventId { get; set; }
public int VenueId { get; set; }
public virtual Venue venue { get; set; }
public virtual ICollection<LeagueEventDetail> LeagueEventDetails { get; set; }
public virtual ICollection<Region> RegionIds { get; set; }
public virtual ICollection<LeagueEventRegistration> LeagueEventRegistrations { get; set; }
}
使用以下配置文件:
public class LeagueEventConfig : EntityTypeConfiguration<LeagueEvent>
{
public LeagueEventConfig()
{
HasKey<int>(e => e.EventId);
Property(e => e.EventId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(u => u.venue).WithMany(w => w.LeagueEventList).HasForeignKey(f=> f.VenueId).WillCascadeOnDelete(false);
HasMany<Region>(r => r.RegionIds).WithMany(e => e.LeagueEventList).Map(ler =>
{
ler.MapLeftKey("EventId");
ler.MapRightKey("RegionId");
ler.ToTable("EventRegion");
});
}
}
发生的事情是在尝试插入一个可以跨越多个区域的联盟事件时发生的,这就是为什么我有 RegionIds 实体在插入和保存之前显示正确的 RegionId 值。但是,在插入并检查 tables 后,它显示:
在 LeagueEvent 中正确创建新记录
在 EventRegion 中创建的新记录具有正确的 EventId,但具有新的 RegionId
在区域 table 中创建了 RegionName 值重复的新记录。
除非我误解了,否则永远不应该从联盟赛事插入中在地区创建新记录。我是不是误解了 fluent handles join tables 的方式?
更新 我删除了 .map 命令并以这种方式对其进行了测试。 EF 继续并创建了 table,但同样的问题不断发生。
现在我手动创建了 EventRegion table 并更新了 Events 和 Regions ICollections 以指向那个 table。现在它正在插入具有来自区域 table 的正确值但来自事件 table 的 0 值的记录。它也不会像以前那样将记录插入区域 table。
似乎正在发生的事情是集合中的 EventRegion 记录被插入到实际事件之前,因此 EventRegion 中 EventId 的值为 0。
虽然很奇怪,但我原以为会产生错误。如果您需要更新的任何代码片段,请告诉我。
如有任何帮助,我们将不胜感激。 谢谢, 克里斯
因为我一直找不到解决办法。我删除了 .map 语句,然后手动创建了连接 table。现在一切都按预期进行。如果能找出问题就好了。