【问题标题】:Trouble getting Entity in DB via primary key通过主键在数据库中获取实体时遇到问题
【发布时间】: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&lt;OtherEntity&gt; 的原因是两者之间的多对多关系。

我的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


【解决方案1】:
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.
}

【讨论】:

  • 是的,抱歉,我编辑了帖子以反映实际发生的情况。我尝试了代码示例,它像其他可能性一样返回 null。但我知道实体存在于数据库中。例如,当我获取整个列表并将其作为 Selectlist 传递到视图中的下拉框时,它会正确加载。
  • 我看不出您的 context.Entitys 有价值但您的 find 方法不起作用的任何原因。你能检查一下你表中的列名是否有相同的名称(EntityId)?
  • 列名对应Entity属性名。表 SQL 如下所示: CREATE TABLE [dbo].[Entities] ( [EntityId] INT IDENTITY (1, 1) NOT NULL, [EntityName] NVARCHAR (MAX) NULL, CONSTRAINT [PK_dbo.Entities] PRIMARY KEY CLUSTERED ([ EntityId] ASC) );
猜你喜欢
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多