获取实体的DbContext(Get DbContext for Entities)
好吧,我觉得有点愚蠢不得不问这个,但我想我对实体框架内部运作的理解是缺乏的。
我想尝试使用
DbContext
。 我有一个使用EF 4.2的现有ASP.NET MVC应用程序。 我可以使用以下方法获取实体:var context = new MyEntities();
这很好用。
但是如何获得由
DbContext
表示的相同数据呢?Okay, I feel a bit foolish for having to ask this but I guess my understanding of the inner workings of Entity Framework is lacking.
I'd like to experiment with work with
DbContext
. I have an existing ASP.NET MVC application using EF 4.2. I can get my entities using:var context = new MyEntities();
And this works just fine.
But how the heck to I get the same data represented by a
DbContext
?
原文:https://stackoverflow.com/questions/11180250
最满意答案
在您的原始问题中,您的问题是Scala编译器无法证明
foo.makeA
的结果类型与参数类型fooWrap.a.useA
。 要做到这一点,它需要能够用fooWrap.a
来证明foo
的身份,我们可以直观地看到这里必须是这种情况,但编译器无法直接跟踪。有几种方法可以解决这个问题。 首先,你可以统一使用
fooWrap.a
代替foo
,scala> fooWrap.a.useA(fooWrap.a.makeA) 1
现在,编译器很容易将A(
fooWrap.a
)的前缀识别为两次出现时相同。其次,你可以通过更精确地捕获其
Foo
参数类型的方式参数化FooWrap
,scala> class FooWrap[F <: Foo](val a: F) { | def wrapUse(v: a.A) = a.useA(v) | } defined class FooWrap scala> val fooWrap = new FooWrap(foo) fooWrap: FooWrap[IntFoo] = FooWrap@6d935671 scala> fooWrap.a.useA(foo.makeA) 1
这里
FooWrap
的类型参数被推断为IntFoo
而不是裸Foo
,因此已知A
恰好是Int
,因为它在foo.makeA
的结果类型中。在您的更新中,您将引入一个额外的皱纹:您将
useA
的签名更改为,def useA(a: A[_]): Unit
_
这里是一个存在主义,它会阻止所有试图诱使编译器证明有用的类型等式的尝试。 相反,你需要的东西,trait Foo { type A[T] def makeA[T]: A[T] def useA[T](a: A[T]): Unit } class OptFoo extends Foo { type A[T] = Option[T] def makeA[T]: A[T] = None def useA[T](a: A[T]) = a map println } class FooWrap[F <: Foo](val a: F) { def wrapUse[T](v: a.A[T]) = a.useA(v) } val foo = new OptFoo
样本REPL会话,
scala> val fooWrap = new FooWrap(foo) fooWrap: FooWrap[OptFoo] = FooWrap@fcc10a7 scala> fooWrap.a.useA(foo.makeA) scala>
In your original question, your problem is that the Scala compiler is unable to prove equality of the result type of
foo.makeA
with the argument type offooWrap.a.useA
. To do that it would need to be able to prove the identity offoo
withfooWrap.a
which we can intuitively see must be the case here, but which isn't straightforward for the compiler to track.There are a couple of ways to work around this problem. First, you could use
fooWrap.a
uniformly in place offoo
,scala> fooWrap.a.useA(fooWrap.a.makeA) 1
Now it's simple for the compiler to recognize the prefix of A (
fooWrap.a
) as being the same in both occurrences.Second, you could parametrize
FooWrap
in a way which captures the type of itsFoo
argument more precisely,scala> class FooWrap[F <: Foo](val a: F) { | def wrapUse(v: a.A) = a.useA(v) | } defined class FooWrap scala> val fooWrap = new FooWrap(foo) fooWrap: FooWrap[IntFoo] = FooWrap@6d935671 scala> fooWrap.a.useA(foo.makeA) 1
Here the type argument of
FooWrap
is inferred asIntFoo
rather than as bareFoo
, henceA
is known to be exactlyInt
, as it is in the result type offoo.makeA
.In your update you introduce an additional wrinkle: you change the signature of
useA
to,def useA(a: A[_]): Unit
The
_
here is an existential which will frustrate all attempts to coax the compiler into proving useful type equalities. Instead you need something along the lines of,trait Foo { type A[T] def makeA[T]: A[T] def useA[T](a: A[T]): Unit } class OptFoo extends Foo { type A[T] = Option[T] def makeA[T]: A[T] = None def useA[T](a: A[T]) = a map println } class FooWrap[F <: Foo](val a: F) { def wrapUse[T](v: a.A[T]) = a.useA(v) } val foo = new OptFoo
Sample REPL session,
scala> val fooWrap = new FooWrap(foo) fooWrap: FooWrap[OptFoo] = FooWrap@fcc10a7 scala> fooWrap.a.useA(foo.makeA) scala>
相关问答
更多-
感谢#scalaz IRC频道上的人们,我找到了基于这篇博文的解决方案。 也就是说,让我们用一个助手Aux扩充Graph对象,它“暴露”了type参数的值: object Graph { trait StringLabels { type NodeLabel = String } type Aux[T0, A0] = Graph[A0] { type T = T0 } } 并将GraphFormat类重新定义为: class GraphFormat[GraphInstance, A] ...
-
我最喜欢的例子: case class Board(length: Int, height: Int) { case class Coordinate(x: Int, y: Int) { require(0 <= x && x < length && 0 <= y && y < height) } val occupied = scala.collection.mutable.Set[Coordinate]() } val b1 = Board(20, 20) val b2 = B ...
-
您可以通过将抽象类型成员移动到类型参数来轻松解决问题,如下所示: trait Simulator[CM[_]] { def useCM(v: CM[_]) } case class CMH[CM[_]](cm: CM[_]) class SimIterator[S <: Simulator[CM], CM[_]](val sim: S, val cmhs: Seq[CMH[CM]]) { cmhs foreach { cmh => sim.useCM(cmh.cm) } } 这样你就可以避免使 ...
-
您可以在那里使用路径依赖类型,但它现在是一个实验性功能。 使用-Xexperimental用于scala或scalac。 $ scala -Xexperimental Welcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_21). Type in expressions to have them evaluated. Type :help for more information. scala ...
-
路径依赖类型与“基础类型”,哪些被检查?(Path-dependent types vs. “underlying types”, which ones are checked?)[2022-05-03]
这与反思没有任何关系。 b1和b2的类型是A (因为这是newInst的返回类型)。 为了调用b1.compare(b2)来编译, b2必须具有类型b1.Impl 。 编译器只知道它是A某个子类型,但它不知道哪一个。 既然你不能通过一个需要A某个子类型的A ,你会得到一个错误。 在这个例子中 val b1 = new B(4) val b2 = new B(5) b1.compare(b2) // no errors 这两个变量都有类型B ,而B#Impl是B ,所以所有的类型都被检查。 This do ... -
在您的原始问题中,您的问题是Scala编译器无法证明foo.makeA的结果类型与参数类型fooWrap.a.useA 。 要做到这一点,它需要能够用fooWrap.a来证明foo的身份,我们可以直观地看到这里必须是这种情况,但编译器无法直接跟踪。 有几种方法可以解决这个问题。 首先,你可以统一使用fooWrap.a代替foo , scala> fooWrap.a.useA(fooWrap.a.makeA) 1 现在,编译器很容易将A( fooWrap.a )的前缀识别为两次出现时相同。 其次,你可以通过 ...
-
scala泛型是否应该使用与路径相关的类型参数?(Are scala generics supposed to work with path-dependent type parameters?)[2021-07-07]
我提交了一个问题: https : //issues.scala-lang.org/browse/SI-9469它已经被接受为现有错误的副本(原因,没有效果),所以可能会修复一些点。 I submitted this an issue: https://issues.scala-lang.org/browse/SI-9469 It has been accepted as a duplicate of an existing bug (in cause, not effect), so presumably ... -
Scala类型投影:在路径相关特征中选择一个对象(Scala type projection: pick an object within a path-dependent trait)[2023-06-20]
module是A一个对象 ,(它取决于A实例),所以这个对象A应该反映在它的类型签名中: scala> typeOf[a.module.type forSome { val a: A }] res1: reflect.runtime.universe.Type = a.module.type forSome { val a: A } 你可以通过在特质A内部创建别名来看到这一点 trait A { type Inner = module.type // it is actually this.modul ... -
编译器有时需要一点帮助来证明在使用路径依赖类型时你所做的是合法的。 也就是说,如你所说,编译器缺少流分析,所以我们必须明确地告诉它,我们不只是使用任何World ,我们正在使用SomeWorld以便我们可以使用SomeWorld.initialState 。 在你的情况下,如果你像这样改变Algorithm : class Algorithm[W <: World](world: W) { def process(s: world.State) { val s1 = world.evolve(s ...
-
Iulian Dragos在最近的一个问题中给出了你需要的答案 。 简短的版本是编译器不进行流分析,所以在你的第一个例子中它不能告诉foo1.Bar和foo2.Bar是相同的类型,因为foo1和foo2只是Foo类型。 但是在第二个例子中,foo1被推断为单例类型Foo.type(Foo的子类型),所以事情按预期工作。 您可以通过将foo2声明为foo1的单例类型来使您的第一个示例工作: val foo2:foo1.type = foo1 请参阅Scala语言规范2.9的第3.2.1节以供参考。 Iuli ...