实体不能在两个ICollections中共存

时间:2014-05-12 13:22:58

标签: c# entity-framework

我的C#项目遇到了麻烦(Visual Studio 2012,Entity Framework 6.0.2)。

我的数据库中有这些实体

public class Activity
{
    [Key]
    public int ActivityId { get; set; }
    ...
    public virtual ICollection<Plan> Plans { get; set; }
    public virtual ICollection<Participant> Participants { get; set; }

    }

public class ActivityConfiguration : EntityTypeConfiguration<Activity>
{
    public ActivityConfiguration()
    {
        ...
        HasMany(a => a.Participants).WithOptional().WillCascadeOnDelete(false);
        HasMany(a => a.Plans).WithOptional().WillCascadeOnDelete(false);

    }
}

//////////

public class Participant
{
    [Key]
    public int ParticipantId { get; set; }
    ...
    public virtual ICollection<Activity> Activities { get; set; }
}

public class ParticipantConfiguration : EntityTypeConfiguration<Participant>
{
    public ParticipantConfiguration()
    {
        HasMany(p => p.Activities).WithOptional().WillCascadeOnDelete(false);
        ...
    }
}

//////////

public class ScheduleContext : DbContext
{
    ...
    public DbSet<Activity> Activities { get; set; }
    public DbSet<Participant> Participants { get; set; }

    public ScheduleContext()
    {
    }

    public ScheduleContext(String connectionString):base(connectionString)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
        modelBuilder.Configurations.Add(new ActivityConfiguration());
        modelBuilder.Configurations.Add(new ParticipantConfiguration());
        }
}

所以我有这种多对多的关系:活动参与者。 现在,我可以通过使用此功能将参与者p1注册到活动a1中

public void Enroll(..., Participant p1, Activity a1)
{
    using (var db = new ScheduleContext(_connectionString))
    {
         //previously checking whether the participant is already enrolled 
         //in the given activity
         ....
         a1.Participants.Add(p1);
         p1.Activities.Add(a1);

         db.SaveChanges();
    }
}

仅当参与者注册了单个活动时才有效;例如,如果我尝试在活动a2中注册相同的参与者p1(其中a1与a2不同),结果是p1从a1.Participants中删除并且被移动&#34;参加者。

我希望我能清楚地解释我的问题并感谢你的时间!

1 个答案:

答案 0 :(得分:2)

您的映射不正确,您在此处所做的是定义几个“一对多”关系,但您需要在活动和参与者之间建立“多对多”关系。

要做到这一点,你必须在“OnModelCreating”方法上做类似的事情:

modelBuilder.Entity<Activity>()
   .HasMany<Participant>(a => a.Participants)
   .WithMany(p => p.Activities)
   .Map(m => {
       m.ToTable("ActivityParticipants");
       m.MapLeftKey("ActivityId");
       m.MapRightKey("ParticipantId");
    });

我希望它会有所帮助。

--------------编辑--------------

关于迁移问题:

首先,您必须在程序包管理器(PM)控制台上运行此命令:

Enable-Migrations

这将使用“Configuration.cs”文件创建存储库“Migrations”。打开此文件并修改配置属性,编辑构造函数如下:

public Configuration()
{
    AutomaticMigrationsEnabled = true;
    AutomaticMigrationDataLossAllowed = true; // optional
}

然后,在PM控制台上运行命令“Update-Database”。应创建关系表“ActivityParticipants”。