我目前正在创建我的第一个"复合体"应用实体框架,我遇到了第一个问题。
我有两个实体:Users
和Events
,定义的User
可以组织Event
或成为Event
的参与者。我希望以这样的方式实现这些实体之间的关系:对于已定义的用户,我可以检索他组织的所有事件或检索他订阅的所有事件。
Event.cs
public virtual User Organizer { get; set; }
public List<User> Participants { get; set; }
User.cs
public virtual ICollection<Event> EventsOrganized { get; set; }
public virtual ICollection<Event> EventsSubscribedFor { get; set; }
如何指定EventsOrganized
应引用Organizer
属性,EventsSubscribedFor
应引用Participants
属性?
答案 0 :(得分:2)
我假设您可以使用Fluent API。
在您的DbContext类中创建或添加到OnModelCreating覆盖
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(s => s.EventsOrganized)
.WithRequired(c => c.Organizer)
.WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
.HasMany(s => s.EventsSubscribedFor)
.WithMany(c => c.Participants)
.Map(cs =>
{
cs.MapLeftKey("UserId");
cs.MapRightKey("EventId");
});
base.OnModelCreating(modelBuilder);
}
发生的事情是我告诉DbContext用户实体有许多EventOrganized与所需的管理器,然后告诉DbContext不级联删除。 然后我告诉DbContext用户实体有很多EventsSubscribed ForFor Many。然后我映射左右键。这会创建一个名为“UserEvents”的表,你可以通过说cs.ToTable(“NameOfTable”)来命名它;
另外参考EntityframeworkTutorials帮助我了解了Fluent API,这些是我用来测试的实体。
public class User
{
public User()
{
EventsOrganized = new HashSet<Event>();
EventsSubscribedFor = new HashSet<Event>();
}
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Event> EventsOrganized { get; set; }
public virtual ICollection<Event> EventsSubscribedFor { get; set; }
}
public class Event
{
public Event()
{
Participants = new HashSet<User>();
}
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int OrganizerId { get; set; }
public virtual User Organizer { get; set; }
public ICollection<User> Participants { get; set; }
}