10

プロジェクトにユーザーモデルとイベントモデルがあります。イベントには作成者(ユーザー)と参加者(ユーザー)がいるため、イベントはユーザーと1対多の関係にあり、同じテーブルに対して多対多の関係もあります。

私は最初、次のような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; }
      ...
}

1対多の関係を削除すると、移行によって多対多の関係が正常に生成されます。

データ注釈のみでこれを行う方法はありますか?

4

2 に答える 2

16

User.EventsEFは、どこにマップする必要があるかを知りません。それは可能性がありますEvent.CreatedByまたはそれは可能性がありますEvent.Users。どちらも有効なモデルになります。[InverseProperty]属性を適用して、EFに必要なヒントを少し与える必要があります。

public class User
{
    ...
    [InverseProperty("Users")]
    public virtual ICollection<Event> Events { get; set; }
    ...
}
于 2013-02-27T20:20:00.990 に答える
8

コードファーストアプローチでは、一部の変換を自動的に使用するDataAnnotationsを使用するのではなく、流暢なAPIを使用することを常にお勧めします。

このようにして、作成した正確な構成を知ることができます。

私があなただったら、これが私が使うものです:

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.
    }
}
于 2013-04-16T06:14:47.153 に答える