4

有没有其他人尝试在具有多个 EF 模型的多个 Api 控制器的解决方案中使用 Breeze.js 的服务器端组件?

我发现在一个上下文中调用 MetaData 端点后,在其他上下文中对 MetaData 端点的所有后续调用都会从第一个调用的上下文返回 MetaData,例如说我有两个 Api 控制器,每个都有自己的 MetaData 端点:

public class CoreController : ApiController
{
    readonly EFContextProvider<CoreEntities> contextProvider = new EFContextProvider<CoreEntities>();
}

public class FormsController : ApiController
{
    readonly EFContextProvider<FormsEntities> contextProvider = new EFContextProvider<FormsEntities>();
}

调用 ~/Core/MetaData 将返回 Core 模型的 JSON,但是随后调用 ~/Forms/MetaData 不会返回 Forms JSON,而是返回 Core 元数据。如果我反过来调用它们,我两次都会得到表单元数据,这个问题似乎一直存在,直到主机进程被回收。

我可以确认我能够按预期从两个模型访问对象数据,所以我怀疑这是一个路由问题。

也许有人可以告诉我是否需要禁用某些缓存?

问候,

汤姆·特雷根纳

4

3 回答 3

2

好的,这应该在 Breeze 0.73.4 中修复,可以通过 nuget 或 zips 在微风网站上获得。

于 2012-11-26T18:08:00.433 回答
1

你说的对。我已经测试了这个问题,并且您报告的这种行为发生了。Metadata()为两个控制器的每种方法设置断点,并使用 Fiddler,我得出结论,这不是路由问题。两个控制器使用不同的上下文(contextProvider的属性),但总是返回第一个被调用的元数据。我想这是微风的图书馆问题。我已经阅读了 Breeze 的文档,但我没有找到任何可以帮助的东西。

于 2012-11-24T17:53:51.267 回答
0

还有另一个具有相同症状的问题。它与连接字符串中对实体框架元数据的模糊引用有关。我有两个单独的 EDMX 文件,它们都被命名为 Model.edmx(单独的项目)。当我引用包含第二个 EDMX 文件的程序集时,下面的连接字符串变得模棱两可——两个 EDMX 文件中的元数据文件都符合描述。

metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;

我能够通过重命名 EDMX 文件之一来解决该问题。

另一种解决方案是将星号替换为包含嵌入式元数据的程序集的全名——这样做实际上有性能优势。有关更多详细信息,请参阅涵盖实体框架连接字符串的 MSDN 文档。

程序集全名

具有嵌入资源的程序集的全名。名称包括简单名称、版本名称、支持的文化和公钥,如下所示:

ResourceLib,版本=1.0.0.0,文化=中性,PublicKeyToken=null

资源可以嵌入到应用程序可访问的任何程序集中。

如果为 assemblyFullName 指定通配符 (*),实体框架运行时将按以下顺序在以下位置搜索资源:

调用程序集。

引用的程序集。

应用程序的 bin 目录中的程序集。

如果文件不在这些位置之一,则会引发异常。

Cc716756.note(zh-cn,VS.100).gif注意:当您使用通配符 (*) 时,实体框架必须在所有程序集中查找具有正确名称的资源。要提高性能,请指定程序集名称而不是通配符。

于 2015-02-06T07:37:29.627 回答