2015-09-26 4 views
1

Я создаю относительно простой webapp, но столкнулся с проблемой. После поиска по низким и высоким показателям, я не могу найти никого с подобными проблемами.Проблема с получением Entity в DB через первичный ключ

Так ситуация:

У меня есть сущность:

public class Entity 
{ 
     [Key] 
     public int EntityId { get; set;} 
     public string EntityName { get; set; } 

     public virtual ICollection<OtherEntity> OtherEntities { get; set; } 
} 

Причина для виртуального ICollection<OtherEntity> это отношения многие ко многим между ними.

Мои DbContext:

public class WebAppDB : IdentityDbContext<ApplicationUser> 
{ 
     public DbSet<Entity> Entities{ get; set; } 

     public WebAppDB() : base("DefaultConnection") 
     { 
     } 

     public static WebAppDB Create() 
     { 
       return new WebAppDB(); 
     } 
    } 
} 

соединение по умолчанию идет на Amazon RDS SQL Server Express.

Вокруг этого я создал репозиторий:

public interface IEntityRepository 
{ 
    IQueryable<Entity> AlEntitiss { get; } 
    IQueryable<Entity> AllEntitissIncluding(params Expression<Func<Entity, object>>[] includeProperties); 
    Entity FindEntity(int id); 
    void InsertOrUpdateEntity(Entity entity); 
    void DeleteEntity(int id); 
    void Save(); 
} 

public class EntityRepository : IEntityRepository 
{ 
    // handle to the database through the O.R.M. system. 
    private WebAppDB context = new WebAppDB(); 

    public IQueryable<Entity> AllCEntitys 
    { 
     get { return context.Entitiss; } 
    } 

    public IQueryable<Entity> AllClassesIncluding(params Expression<Func<Entity, object>>[] includeProperties) 
    { 
      IQueryable<Entity> query = context.Entitiss; 

      foreach (var includeProperty in includeProperties) 
      { 
       query = query.Include(includeProperty); 
      } 

      return query; 
    } 

    public Entity FindEntity(int id) 
    {      
     return context.Entitiss.Find(id); 
    } 

    public void InsertOrUpdateEntity(Entity Entity) 
    { 
      if (Entity.EntityId == 0) 
      { 
       context.Entitiss.Add(Entity); 
      } 
      else 
      { 
       context.Entry(Entity).State = EntityState.Modified; 
      } 
    } 

    public void DeleteEntity(int id) 
    { 
      Entity Entity = FindEntity(id); 
      context.Entitys.Remove(Entity); 
    } 

    public void Save() 
    { 
     context.SaveChanges(); 
    } 
} 

Теперь проблема заключается в том, что я могу получить список лиц, у меня есть в базе данных и загружать их только штраф в Selectlists или аналогичный структур. Я также могу получить конкретные объекты, основанные на других свойствах, чем первичный ключ.

Но я не могу получить единую сущность из базы данных, используя первичный ключ в качестве точки входа. Я попытался с помощью DbSet.Entities.SingleOrDefault(), .Single(), .Find()

Я также попытался восстановить его с помощью

DbSet.Entities.ToList().Where(x => x.EntityId == id) 

Я переехал из 2 контекстов данных до 1, я проверил, что я ссылающийся на ту же версию EF во всех проектах в решении (есть отдельный проект для объектов).

После того, как прочитал This, я поиграл с ленивой загрузкой, но никакого эффекта.

Итак, у меня заканчиваются идеи и места для поиска.

Если вам нужна дополнительная информация, я предоставлю все возможное.

Благодарим вас за чтение и помощь.

Update1:

Я попытался двигаться в локальную базу данных, не повезло, и кажется, что я ранее описал погрузочными списки лиц, работающих преувеличена. Они также не загружаются последовательно при вызове.

Update 2:

Использовав SQL Profiler, чтобы определить, что не все звонки с контроллерами, где выполняются на базе данных, я пытался пересадить сущности к новому проекту MVC. К сожалению, проблема не устранена, и я не согласен с этим.

Обновление 3: После очередного расследования и некоторой помощи от Герта Арнольда выяснилось, что я неправильно диагностировал исходную проблему.Из-за плохой практики кодирования это была не одна центральная проблема, а несколько отдельных проблем, все из которых имели сходные характеристики, привели меня к неверному выводу о том, что EF был виноват. Мне жаль, что я потратил время на это.

+0

Что возвращается, когда вы вызываете FindEntity (id)? – JTY

+0

возвращается Null. И я уверен, что entityId, который я ищу, существует в БД. – Nephross

+0

@Nephross Вы можете видеть, какие запросы выполняются на сервере? – silkfire

ответ

0
public Class FindEntity(int id) 
{ 
    //Want to find a specific student 
    return context.Entitys.Find(id); 
} 

Это один кажется немного странным для меня, в чем Class? Я думаю, что это должно быть Student. В любом случае, проверьте пример кода ниже:

public Entity FindEntity(int id) 
{ 
    return context.Entities.FirstOrDefault(e => e.EntityId == id); // note that it will return null if not found. 
} 
+0

Да, извините, я отредактировал сообщение, чтобы отразить то, что на самом деле происходит. Я попробовал образец кода, и он возвращает null, как и другие возможности. Но я знаю, что Сущность существует в БД. Он правильно загружается, когда я беру весь список и передаю его как список выбора в раскрывающийся список в представлении, например. – Nephross

+0

Я не вижу причин, по которым ваш контекст. Значения имеют значение, но ваш метод поиска не работает. Вы можете проверить имя столбца в своей таблице с тем же именем (EntityId)? –

+0

Имя столбца соответствует имени свойства Entity. Таблица SQL выглядит следующим образом:. CREATE TABLE [DBO] [Объекты] ( [EntityId] INT IDENTITY (1, 1) NOT NULL, [EntityName] NVARCHAR (MAX) NULL, CONSTRAINT [PK_dbo.Entities] ПЕРВИЧНАЯ КЛАВИАТУРА ([EntityId] ASC) ); – Nephross