この質問: Ef Many To Manyでは、リンク テーブルを手動で指定する方法について回答がありました。しかし、私には少し特殊な状況があります (これは本当に特殊なことではないと確信しています)。
私の 2 つのテーブルにはそれぞれ Id フィールドがあります。例:[dbo].[Account].[Id]
と[dbo].[Person].[Id]
. 私の Code-First のこれらの各テーブルには、次の OnModelCreating があります。
modelBuilder.Entity<Account>.HasKey(x => x.Id);
modelBuilder.Entity<Person>.HasKey(x => x.Id);
しかし、私の[dbo].[AccountsToPersons]...
テーブルにはフィールド EG:[AccountId]
と[PersonId]
AccountsToPersons テーブルは、コード内のクラスによって表されません。
私は明らかに既存のモデルを持っていますが、データベースからモデルを更新する代わりに、EF Code-First Fluent API を使用しています。
では、このコードを変更して、異なる ID 列名のマッピングで機能するようにするにはどうすればよいでしょうか?
public DbSet<Person> Persons { get; set; }
public DbSet<Account> Accounts { get; set; }
. . .
modelBuilder.Entity<Account>()
.HasMany(a => a.Persons)
.WithMany()
.Map(x =>
{
x.MapLeftKey("AccountId"); // <-- Account.Id to AccountsToPersons.AccountId??
x.MapRightKey("PersonId"); // <-- Person.Id to AccountsToPersons.PersonId??
x.ToTable("AccountsToPersons");
});
基本的な Linq To EF Query を実行する(from x in context.Accounts select x).ToList();
と、クエリは次のエラーで失敗します。
- 「列名 'Person_Id' が無効です。」
しかし、 Query を実行して(from x in context.Persons select x).ToList();
もエラーは発生しません。
基本的な型付けされた列以外に、私のモデルにはこれらが追加されています。
// In my Account Model, I also have this property:
public IList<Person> Persons { get; set; }
// In my Person Model, I also have this property:
public IList<Account> Accounts { get; set; } // <-- in the Person model
また、Accounts クエリがパスしてフィールド情報が含まれている場合でも、テーブルPersons
にリンクがあると確信していても、フィールドは常に null であることに注意してください。AccountsToPersons