我的C#项目(Visual Studio2012,Entity Framework6.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());
}
}所以我有一个多对多的关系:活动-参与者。现在,我可以使用此函数在活动a1中注册参与者p1
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中。
我希望我对我的问题的解释是清楚的,感谢您的时间!
发布于 2014-05-12 21:36:29
你的映射是不正确的,你在这里做的是定义几个“一对多”的关系,但你需要在活动和参与者之间有一个“多对多”的关系。
为此,您必须在您的"OnModelCreating“方法上执行类似以下操作:
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)控制台上运行以下命令:
Enable-Migrations这将创建一个包含"Configuration.cs“文件的存储库"Migrations”。打开该文件,修改配置属性,按如下方式编辑构造函数:
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true; // optional
}然后,在PM控制台上运行"Update-Database“命令。应该创建关系表"ActivityParticipants“。
https://stackoverflow.com/questions/23610264
复制相似问题