我正在构建一个相对简单的webapp,但遇到了一些问题。在搜索了低点和高点之后,我似乎找不到任何有类似问题的人。
所以情况:
我有一个实体:
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:
我已经尝试过移动到本地数据库而没有运气,似乎我之前描述的加载实体工作列表的工作被夸大了。调用时它们也不会持续加载。
更新2:
使用SQL分析器确定并非所有来自控制器的调用都在数据库上执行,我尝试将实体移植到新的MVC项目中。不幸的是,这个问题仍然存在,而且我在这一点上没有想法。
更新3: 经过一些调查和Gert Arnold的一些帮助后,我发现我误解了最初的问题。由于编码实践不佳,这不是一个核心问题,但是几个单独的问题都表现出相似的特征,这些问题导致我得出错误的结论,即EF是错误的。我很遗憾任何人浪费时间。
答案 0 :(得分: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.
}