在代码优先(实体框架)中使用查找来获取非主键

时间:2012-01-16 06:20:31

标签: entity-framework-4.1 ef-code-first code-first

我的理解是find只将主键作为参数。如果您要查找的值实际上是主键,则效果很好。就我而言,我有一个这样的课程:

 public class Chamber
 {
    [Key]
    public int Id {get;set;}

    public string ChamberName { get; set; }
 }

我想检查我的上下文或数据库本身是否存在给定的ChamberName。我怎样才能做到这一点?我是否必须首先以某种方式枚举上下文,然后使用db.Chambers.where(a=>a.ChamberName.equals...之类的调用在数据库中查找?

如果ChamberName是我的主键,我可以看到它运作良好,但事实并非如此。

谢谢,

2 个答案:

答案 0 :(得分:2)

您无法使用.Find()方法 - 但如何:

public Chamber FindByChamberName(string chamberName) 
{    
   using(MyDbContext ctx = new MyDbContext())
   {
      Chamber result = ctx.Chambers
                          .FirstOrDefault(c => string.Compare(c.ChamberName, chamberName, true));
      return result;
   }
}

您不必手动枚举任何内容 - 只需按该名称检索第一个腔室出现 - 或者不检索。

如果你只是需要知道给定的腔室(由ChamberName指定)是否存在,你可以使用Linq中的.Any()方法:

using(MyDbContext ctx = new MyDbContext())
{
    return ctx.Chambers.Any(c => string.Compare(c.ChamberName, chamberName, true));
}

答案 1 :(得分:2)

DbSet中有一个名为Local的媒体资源。您可以先查询它以查找加载到上下文中的实体。

var entity = db.Chambers.Local.Where(/**/).SingleOrDefault();

if (entity == null)
{
   entity = db.Chambers.Where(/**/).SingleOrDefault();
}