簡體   English   中英

EF Db First方法-處理不帶PK的表

[英]EF Db First approach - dealing with tables without PK's

我嘗試使用db first方法為現有db創建上下文,並得到以下錯誤:

//無法為表'dbo.TT_ProjectMembers'生成實體類型。 請查看警告消息。 無法識別表'dbo.TT_ProjectMembers'的主鍵。 無法為表“ dbo.TT_ProjectMembers”生成實體類型。

TT_ProjectMembers表包含兩列:ProjectId(int)UserId(int)。 不幸的是,我沒有機會更新數據庫(添加新列等)。

我決定手動創建實體和所有其他內容。 我決定為此表設置復合鍵,因為這很有意義-兩行具有相同的ProjectId和UserId是錯誤的。

//entity class

    public class ProjectMember
    {
        public int ProjectID { get; set; }
        public int UserID { get; set; }

    }

    //dbcontext property
    public virtual DbSet<ProjectMember> ProjectMembers { get; set; }    

    // entity config
        modelBuilder.Entity<ProjectMember>(entity =>
    {
        entity.ToTable("TT_ProjectMembers");
        entity.HasKey(p => new {p.ProjectID, p.UserID});
    });

令人驚訝的是,它起作用了。 現在我可以執行任何CRUD操作,但是我有一些問題:

  1. 這樣解決問題是否有任何不利或問題? 您通常如何解決此問題?
  2. 為什么EF需要您在桌上擺放PK?
  3. EF如何在幕后工作? (我知道這是一個廣泛的問題,因此,對任何書籍/文章的建議都將不勝感激)

1)這樣。 將M:M關系分解為兩個1:M的中間人表應將兩個外鍵列作為其PK。 使此類表具有第三個PK列是一個菜鳥錯誤

2)因為這就是當您要查詢相關數據時它的查找方式( employee.Company.Name可能會導致為該雇員加載公司數據,因此可能會導致出現類似SELECT Company.* FROM Company JOIN Employee ON Company.ID = Employe.CompanyId WHERE Employee.Id = @id或者,如果不使用聯接,則從該員工中查詢CompanyId,然后從Company ID中查詢公司詳細信息),以及如何確定僅在行時更新持續的變化。 “沒有PK,沒有比賽!”

3)恐怕SO太寬泛,但是您不妨去尋找一些資源,這些資源向您展示如何激活它生成的查詢的日志記錄,然后您就可以看到何時執行context.Employee.Where(e => e.Name = "John")如何變成SELECT x FROM Employee WHERE name = 'John'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM