无法通过主键

时间:2015-09-26 17:29:27

标签: c# asp.net asp.net-mvc entity-framework

我正在构建一个相对简单的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是错误的。我很遗憾任何人浪费时间。

1 个答案:

答案 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.
}