【问题标题】:SqlQuery EntityKey and return corresponding objectSqlQuery EntityKey 并返回对应对象
【发布时间】:2013-12-19 11:11:01
【问题描述】:

我想根据 EntityKey 查询我的数据库,是否有内置(或更简单的方法)来执行此操作?

我目前的做法是这样的:

using (var context = new DbContext())
{
    context.DataBase.SqlQuery<TestTable>("select * from @p0 where @p1 = @p2", EntityKey.EntitySetName, EntityKey.EntityKeyValues[0].Name, EntityKey.EntityKeyValues[0].Value);
}

(此解决方案目前存在问题,EntitySetName 不是 TableName,我需要从 MetaData 中获取 TableName,与 Id 的名称相同,也可能与数据库不同)

或者有没有办法用 LINQ 做到这一点? (我更喜欢,因为我不需要手动翻译)

【问题讨论】:

  • Ur Q 不是很清楚..你遇到什么错误?
  • @Rupesh:我绝对没有错误,我只想知道是否有办法在 EntityKey 属性的帮助下查询数据库,您在答案中发布的链接是否为我使用,因为我已经在使用 EntityFramework。我的问题是如何做到这一点,只有 EntityKey。
  • 有什么原因不能使用context.Set&lt;TestTable&gt;().Find(EntityKey.EntityKeyValues[0].Value)
  • @SteveRuble 不是,这就是我问如何实现它的原因。 :)

标签: c# entity-framework entity-framework-5 entitykey


【解决方案1】:

您可以将DbContext 转换为IObjectContextAdapter 接口,然后您可以从那里访问具有GetObjectByKey method 的底层ObjectContext 对象:

using (var context = new DbContext())
{
    var objectContext = ((IObjectContextAdapter)context).ObjectContext;
    var entity = objectContext.GetObjectByKey(yourEntityKey);
}

【讨论】:

  • 如果我没记错的话,这只适用于已经加载并与此上下文相关的那些,并且不会查询数据库。
  • 不,根据 msdn,它应该查询 db:“如果对象当前未加载到对象上下文中,则执行查询以尝试从数据源返回对象。”
【解决方案2】:

如果您知道要检索的实体的类型,则可以使用 DbContext 上的 Set 方法获取 DbSet,并使用 DbSet 上的 Find 方法通过其键获取实体(s)。

var dbSet = dbContext.Set<TestTable>();
var entity = dbSet.Find(EntityKey.EntityKeyValues[0].Value);

Find方法知道如何轮流使用键值来获取实体;事实上,签名是Find(params object[]),所以如果你的表有一个复合键,你可以传入多个键值(只要它们的顺序正确)。

【讨论】:

  • 给了你+50,因为这个解决方案不需要强制转换为 IObjectContextAdapter。
猜你喜欢
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 2018-08-04
  • 2021-07-05
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多