实体框架:如何从具有复合键的表中返回一行?

Posted

技术标签:

【中文标题】实体框架:如何从具有复合键的表中返回一行?【英文标题】:Entity framework: How to return a row from a table with composite keys? 【发布时间】:2013-02-08 21:38:58 【问题描述】:
  public class UserBuilding
    
        [Key, Column(Order = 0)]
        public int UserId  get; set; 
        [Key, Column(Order = 1)]
        public int BuildingId  get; set; 
        public int BuildingLevel  get; set; 
    

如果我想返回属于用户的所有不同建筑物,我会执行以下操作:

database.UserBuildings.Where(b => b.UserId == userId);

我的问题是,如果我想从特定用户那里归还特定建筑物怎么办?这样做最“有效”的方法是什么?有没有比以下更好的方法(比如内置函数):

database.UserBuildings.Where(b => b.UserId == userId && b.BuildingId == buildingId);

【问题讨论】:

【参考方案1】:

我认为您正在寻找DbSet.Find 方法。此方法通过主键查找实体。如果您有复合主键,则按照它们在模型中定义的顺序传递键值:

var userBuilding = database.UserBuildings.Find(userId, buildingId);

【讨论】:

像魅力一样工作谢谢!您认为就算法的速度而言,这会被认为“更高效”吗? @Deniz Find 在查询数据库之前首先检查实体是否已经在上下文中,所以是的,它更有效 @Deniz: Find 如果实体加载(***.com/questions/11686225/…),实际上会慢得多。经验法则,也许:如果对象可能已经在上下文中,请使用Find。如果您知道它尚未加载或不太可能加载,请在您的问题中使用查询。 @Slauma 谢谢,不知道如果实体不在上下文中,Find 会慢得多。顺便说一句,有性能测试吗? @lazyberezovsky:关于Find 我只知道链接问题中的测量值。通常,DbContext 中的自动更改检测(=在许多 EF 方法中发生的内部 DetectChanges 调用)因速度慢而臭名昭著(Attach 是另一个示例:***.com/a/5921259/270591。或Add:***.com/a/5943699/270591)。但在只有少数实体附加到上下文的情况下,这无关紧要。通常只考虑“批量操作”。

以上是关于实体框架:如何从具有复合键的表中返回一行?的主要内容,如果未能解决你的问题,请参考以下文章

使用复合键的许多人:如何在实体之间的表中添加元素?

Hibernate 对具有复合键的子实体执行错误的插入顺序

学说:具有复合键的实体之间的 ManyToX 关系

创建复合键实体框架

如何在SQL Server中获取具有复合主键的表列表?

如何在实体框架中为复合主键的特定列创建外键