【发布时间】:2015-09-26 17:29:27
【问题描述】:
我正在构建一个相对简单的 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();
}
}
现在,问题在于我可以获取数据库中的实体列表并将它们加载到选择列表或类似结构中。 我还可以根据主键以外的其他属性获取特定的实体。
但我无法使用主键作为入口点从数据库中获取单个实体。我试过使用DbSet.Entities.SingleOrDefault()、.Single()、.Find()
我也尝试使用
检索它DbSet.Entities.ToList().Where(x => x.EntityId == id)
我已从 2 个数据上下文移至 1 个,我已检查我是否在解决方案的所有项目中引用了相同版本的 EF(实体有一个单独的项目)。
阅读This后,我摆弄了延迟加载,但没有效果。
所以我的想法和地方都用完了。
如果您需要更多信息,我会尽我所能提供。
感谢您的阅读和帮助。
更新1:
我尝试过迁移到本地数据库,但没有成功,而且我之前描述的加载实体工作列表的内容似乎被夸大了。它们在调用时也不会始终如一地加载。
更新 2:
在使用 SQL 分析器确定并非所有来自控制器的调用都在数据库上执行后,我尝试将实体移植到新的 MVC 项目中。不幸的是,问题仍然存在,我对此一无所知。
更新 3: 经过更多的调查和 Gert Arnold 的帮助后,事实证明我误诊了最初的问题。由于糟糕的编码实践,这不是一个核心问题,而是几个独立的问题都表现出相似的特征,这导致我得出错误的结论,即 EF 有问题。很抱歉浪费了任何人的时间。
【问题讨论】:
-
调用 FindEntity(id) 时返回什么?
-
它返回 Null。而且我确定我正在寻找的 entityId 存在于数据库中。
-
@Nephross 你能看到服务器上运行了哪些查询吗?
-
@silkfire 我不太清楚该怎么做,但会找到并回复你。
-
@Nephross 您必须在运行代码时使用 SQL Profiler。它可以从管理器中的菜单访问。
标签: c# asp.net asp.net-mvc entity-framework