EF多对多将记录插入主表以及连接表

时间:2015-03-07 21:25:01

标签: entity-framework code-first fluent

我有一个奇怪的情况,有很多关系和插入数据。 表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; }


}

区域表的配置文件:

    public class RegionConfig : EntityTypeConfiguration<Region>
{
    public RegionConfig()
    {
        HasKey<int>(r => r.RegionId);
        Property(r => r.RegionId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }

对于表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值。但是,在插入并检查表格后,它显示:

在LeagueEvent中正确创建了新记录

在EventRegion中创建的新记录包含正确的EventId(s)但具有新的RegionIds

在Region表中创建的新记录,RegionName值重复。

除非我误解,否则在联盟赛事插入区域中永远不应该在区域中创建新记录。我是否误解了如何处理连接表?

更新 我删除了.map命令并以这种方式进行了测试。 EF继续创建表格,但同样的问题仍然存在。

所以现在我手动创建EventRegion表并更新了Events和Regions ICollections以指向该表。现在它正在使用Regions表中的正确值插入记录,但是来自Events表的值为0。它也不会像之前一样将记录插入Region表。

似乎正在发生的事情是集合中的EventRegion记录正在实际事件之前插入,因此在EventRegion中为EventId的值为0.

奇怪的是,我认为会产生错误。如果您需要更新的任何代码段,请告诉我们。

任何帮助将不胜感激。 谢谢, 克里斯

1 个答案:

答案 0 :(得分:0)

因为我从未找到解决方案。我删除了.map语句,然后手动创建了连接表。现在一切都按预期工作了。只是很高兴找出问题。