[英]EF Core - insert record sequentially in DB without identity on 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)這樣。 將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.