10

关系我有一个用户模型,并在自己的项目中事件模型。该事件具有创建者(用户)并且具有参与者(用户),因此事件与用户具有一对多关系,并且与同一个表具有多对多关系。实体框架代码优先:1,到许多和许多一对多到同一个表

我第一次一个一对多这样的关系:

Public class Event 
{ 
     ... 
     public int CreatedById { get; set; } 
     public virtual User CreatedBy { get; set; } 
     ... 
} 

然后当我加入了许多一对多的关系迁移不会产生多对多的关系:

Public class User 
{ 
     ... 
     public virtual ICollection<Event> Events { get; set; } 
     ... 
} 

Public class Event 
{ 
     ... 
     public int CreatedById { get; set; } 
     public virtual User CreatedBy { get; set; } 
     public virtual ICollection<User> Users { get; set; } 
     ... 
} 

如果删除了一对多的关系那么迁移产生许多一对多关系成功。

有没有办法做到这一点只有数据注释?

+0

你说得对@slauma,原谅我的英语不是我的母语,我只是尽力做到最好。 – Escobar5 2013-02-27 20:29:58

+0

我编辑它,希望更清楚 – Escobar5 2013-02-27 20:31:57

+0

我不是指一种语言的东西,但内容(如果有任何错误信息或例外等,或者如果结果不是你所期望的等)。无论如何,没关系,问题似乎已经解决:) – Slauma 2013-02-27 21:01:22

回答

15

EF不知道从哪里User.Events必须映射到。它可能是Event.CreatedBy或它可能是Event.Users。两者都会导致一个有效的模型。你必须给EF你想通过应用[InverseProperty]属性有什么小提示:

public class User 
{ 
    ... 
    [InverseProperty("Users")] 
    public virtual ICollection<Event> Events { get; set; } 
    ... 
} 
+0

完美!就是这样 – Escobar5 2013-02-27 20:28:37

8

随着代码第一种方式,我总是建议使用流利的API,而不是使用DataAnnotations,它会自动使用一些转换。

这样,你就会知道你做了什么确切的配置。

如果我是你,这里是我会用什么:

public class EventMap : EntityTypeConfiguration<Event> 
{ 
    public EventMap() 
    { 
     this.HasRequired(m => m.CreatedBy) // envent must have a creator 
      .WithMany() // a user can have 0,1 or more events created by him 
      .HasForeignKey(m => m.CreatedById) // specify property to be used as FK 
      .WillCascadeOnDelete(true); // delete all events created by user if that specific user is deleted 

     this.HasMany(m=>m.Users) // an event can have 0,1 or more participants 
      .WithMany(m=>m.Events) // a user can be a participant in 0,1 or more events     
      .Map(m => m.MapLeftKey("EventId").MapRightKey("UserId")); // this will generate intermediate table to hold participant information - dbo.EventUser with EventId & UserId 
      // Cascade Delete is always true for Many to Many mapping. however, it doesn't delete entry in other table, it deletes entry in Joined Table only. 
    } 
} 
相关问题