首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体不能在两个ICollections中共存

实体不能在两个ICollections中共存
EN

Stack Overflow用户
提问于 2014-05-12 21:22:58
回答 1查看 88关注 0票数 1

我的C#项目(Visual Studio2012,Entity Framework6.0.2)出了点问题。

我的数据库中有这些实体。

代码语言:javascript
复制
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());
        }
}

所以我有一个多对多的关系:活动-参与者。现在,我可以使用此函数在活动a1中注册参与者p1

代码语言:javascript
复制
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();
    }
}

这仅在参与者注册到单个活动中时有效;例如,如果我尝试在Activity a2中注册相同的参与者p1 (其中a1与a2不同),结果是p1从1.Participants中删除,并“移动”到2.Participants中。

我希望我对我的问题的解释是清楚的,感谢您的时间!

EN

回答 1

Stack Overflow用户

发布于 2014-05-12 21:36:29

你的映射是不正确的,你在这里做的是定义几个“一对多”的关系,但你需要在活动和参与者之间有一个“多对多”的关系。

为此,您必须在您的"OnModelCreating“方法上执行类似以下操作:

代码语言:javascript
复制
modelBuilder.Entity<Activity>()
   .HasMany<Participant>(a => a.Participants)
   .WithMany(p => p.Activities)
   .Map(m => {
       m.ToTable("ActivityParticipants");
       m.MapLeftKey("ActivityId");
       m.MapRightKey("ParticipantId");
    });

我希望它能有所帮助。

-编辑

关于您的迁移问题:

首先,您必须在Package Manager (PM)控制台上运行以下命令:

代码语言:javascript
复制
Enable-Migrations

这将创建一个包含"Configuration.cs“文件的存储库"Migrations”。打开该文件,修改配置属性,按如下方式编辑构造函数:

代码语言:javascript
复制
public Configuration()
{
    AutomaticMigrationsEnabled = true;
    AutomaticMigrationDataLossAllowed = true; // optional
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23610264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档