1

多対多の関係で結合テーブルを表すには、POCO クラスを作成する必要がありますか?

これは私のシナリオです:

public class Event 
{
    public int EventId { get; set; }
    public int OrganizerId { get; set; }
}

public class Person 
{
    public int PersonId { get; set; }
    ICollection<Event> Events { get; set; }
}

public class Company 
{
    public int CompanyId { get; set; }
    ICollection<Event> Events { get; set; }
}

Person と Company の両方がイベントを開催できるので、次のような参加テーブルを作成することを考えました

Table Events_People
PersonId
OrganizerId


Table Events_Companies
CompanyId
OrganizerId

次のような2つのPOCOクラスを作成すると、簡単に実行できるはずです。

public class EventPerson
{
    public int EventId { get; set; }
    public Person PersonId { get; set; }
}

Fluent APIのようなものよりも

modelBuilder.Entity<Person>()
// PK
.HasKey(e => e.PersonId)
// FK
.HasMany(e => e.Events)
.WithRequired(e => e.PersonId);

2 つの POCO を回避し、結合テーブルを作成するよう API に直接指示する方法はありますか? ありがとう

4

1 に答える 1

1

はい、EFで多対多を行うことができます。より大きな問題は、それは良い考えだということです。たとえば、カスケード削除に問題があり、それが必要または必要な場合は、問題が発生する可能性があります。同じエンティティ(必ずしも特定のサンプルコードである必要はありません)に対して2つの必須の関係があり、より一般的に質問に一致する場合は、WillCascadeOnDelete(false)を使用しない限り、EFコンパイル/ランタイムエラーが発生する可能性があります。人々が考える場合に備えて、あなたはそうすることができます。気をつけて。:-)

しかし、あなたはEFに参加を作成するように指示できますかと尋ねました

EFによって生成された結合テーブルが表示されませんでしたか?私はそれを期待していたでしょう。どうしてか気になります。

明示的に管理できます。

HasMany(t => t.NavigationProperty1)
.WithMany(a => a.ReverseNavigationProperty)
.Map(c => c.ToTable("TheJoinTable"));



// rename keys as required, may not be required...
c.MapLeftKey("ColumnKeyName");
c.MapRightKey("ABetterName2");

ところで、あなたが提案する例は、CascadeOnDeleteの問題を回避するために必要なパターンです。

于 2013-02-17T12:32:50.860 に答える