我的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;参加者。
我希望我能清楚地解释我的问题并感谢你的时间!
答案 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”。