Использование Find в CodeFirst (EntityFramework) для получения не первичных ключей - PullRequest
1 голос
/ 16 января 2012

Насколько я понимаю, команда 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 ]

2 голосов
/ 16 января 2012

В DbSet есть свойство с именем Local .Вы можете сначала выполнить запрос, чтобы найти объекты, загруженные в контекст.

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

if (entity == null)
{
   entity = db.Chambers.Where(/**/).SingleOrDefault();
}
2 голосов
/ 16 января 2012

Вы не можете использовать метод .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;
   }
}

Вам не нужно ничего перечислять вручную - просто получить первый случай камеры с этим именем - илиnone.

Если вам просто нужно узнать, существует ли данная камера (указанная ее ChamberName) или нет, вы можете использовать метод .Any() в Linq:

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