Я создаю относительно простой 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 был виноват. Мне жаль, что я потратил время на это.
Что возвращается, когда вы вызываете FindEntity (id)? – JTY
возвращается Null. И я уверен, что entityId, который я ищу, существует в БД. – Nephross
@Nephross Вы можете видеть, какие запросы выполняются на сервере? – silkfire