質問: 私はdbの最初のアプローチを使用して既存のdbのコンテキストを作成しようとしましたが、以下のエラーが発生しました: > //テーブル 'dbo.TT_ProjectMembers'のエンティティタイプを生成できません。警告メッセージを見てください。テーブル 'dbo.TT_ProjectMembers'の主キーを識別できません。テーブル 'dbo.TT_ProjectMembers'のエンティティタイプを生成できません。 > > TT_ProjectMembersテーブルには、ProjectId(int)とUserId(int)の2つの列があります。残念ながら、データベースを更新する(新しい列を追加するなど)ことはできません。 私はエンティティと他のすべてのものを手動で作成することにしました。このテーブルには複合キーを設定することにしました。それは意味があるからです。同じProjectIdとUserIdを持つ2つの行があるのは間違っています。 ``` //entity class public class ProjectMember { public int ProjectID { get; set; } public int UserID { get; set; } } //dbcontext property public virtual DbSet ProjectMembers { get; set; } // entity config modelBuilder.Entity(entity => { entity.ToTable("TT_ProjectMembers"); entity.HasKey(p => new {p.ProjectID, p.UserID}); }); ``` 驚いたことに、それはうまくいった。これでCRUD操作を実行できますが、いくつか質問があります。 1. このような問題解決による不利益や問題はありますか?通常、この問題をどのように解決しますか。 2. なぜEFはあなたがテーブルにPKを持っている必要がありますか? 3. フードの下でEFはどのように機能しますか? (私はこれが幅広い質問であることを知っているので、どんな本/記事のアドバイスでも評価されるでしょう)
回答: 1)こんな感じ。 M:Mの関係を2つの1:Mに分解するミドルマンテーブルは、2つの外部キー列をそれらのPKとして持つ必要があります。そのようなテーブルに3番目のPK列を持たせるのはルーキーエラーです 2)そのため、要求時に関連データが検索されるため( `employee.Company.Name`によって会社データがその従業員にロードされる可能性があるため、 `SELECT Company.* FROM Company JOIN Employee ON Company.ID = Employe.CompanyId WHERE Employee.Id = @id`ような結果になる可能性があります`SELECT Company.* FROM Company JOIN Employee ON Company.ID = Employe.CompanyId WHERE Employee.Id = @id`または結合が使用されていない場合は、その従業員からCompanyIdを照会し、次にCompany IDから会社の詳細を照会します。持続的な変化。 「ノーPK、ノープレイ!」 3)あまりに広すぎるので、私は怖いですが、それが生成するクエリのロギングを有効にする方法を示すリソースを見て自由に感じることができます、そしてあなたは`context.Employee.Where(e => e.Name = "John")`をするとき見ることができます) `context.Employee.Where(e => e.Name = "John")` `SELECT x FROM Employee WHERE name = 'John'`などになる方法