[英]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.