小编Jon*_*ora的帖子

Breezejs EntityManager MetadataStore和fetchEntityByKey

我有一个SPA应用程序(durandaljs),我有一个特定的路由,我映射我想要获取的实体的"id".

模板是"/#/ todoDetail /:id".

例如,"/#/ todoDetail/232"或"/#/ todoDetail/19".

在viewmodel的激活功能上,我得到了路由信息,所以我可以获取id.然后我创建了一个breezejs EntityManager的新实例来获取具有给定id的实体.

问题是当我调用manager.fetchEntityByKey("Todos",id)时,EntityManager还没有来自服务器的元数据,所以它抛出异常"无法通过名称找到'Type':Todos".

只有在调用fetchEntityByKey之前首先对存储(manager.executeQuery)执行查询时,它才有效.

这是预期的行为还是错误?在实例化EntityManager期间有没有办法自动生成元数据?

注意:我认为在我的情况下很难使用共享的EntityManager,因为我想允许用户直接在浏览器上键入路由.

编辑:作为临时解决方法,我这样做:

BreezeService.prototype.get = function (id, callback) {
    var self = this;

    function queryFailed(error) {
        app.showMessage(error.message);
        callback({});
    }

    /* first checking if metadatastore was already loaded */

    if (self.manager.metadataStore.isEmpty()) {
        return self.manager.fetchMetadata()
        .then(function (rawMetadata) {
            return executeQuery();
        }).fail(queryFailed);
    } else {
        return executeQuery();
    }

    /* Now I can fetch */
    function executeQuery() {
        return self.manager.fetchEntityByKey(self.entityType, id, true)
                        .then(callback)
                        .fail(queryFailed);
    }
};
Run Code Online (Sandbox Code Playgroud)

breeze durandal

5
推荐指数
1
解决办法
5038
查看次数

具有多个迁移和从同一数据库中的基本 DbContext 继承的实体框架

我正在构建一个可扩展的自定义 CMS 解决方案,其中我有一个名为 CmsDbContext 的父 DbContext,其中包含 CMS 表的实体,例如:用户表。CmsDbContext 已启用自动迁移。我希望允许最终用户从 CmsDbContext 继承,以便通过添加/映射 DbSet 属性和自定义 POCO 创建自定义额外表/实体。

Cms 需要在派生的 DbContext 初始化之前在 PreStart 中初始化他的 CmsDbContext。到目前为止一切顺利,当我初始化 CmsDbContext 时,表已成功创建。当我初始化派生的 DbContext 例如 CustomCmsDbContext 时,额外的表被成功创建。但是当 Web 应用程序重新启动时,CmsDbContext 的迁移过程会擦除不属于上下文的表,并重新创建继承的 CustomDbContext 的表。

我知道可以创建多个不相关的 DbContext,并在同一数据库中启用自动迁移,因为 DbMigrationsConfiguration 的 ContextKey 属性会。但是我在这里需要继承以允许 CustomCmsDbContext 上下文对由 CmsDbContext 映射的现有表进行查询,因此两个上下文的行为都像一个 DbContext,启用了迁移。

所以我们知道问题是父DbContext在迁移过程中删除了子DbContext的表,而子DbContext在迁移过程中重新创建了缺失的表。

如何避免删除不属于 DbContext 的表的迁移?

这是伪代码:

public class CmsDbContext: DbContext {

    static CmdDbContext() {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<CmsDbContext, Migrations.CmsDbContextConfiguration>());
    }

    public DbSet<User> Users { get; set; }
}


public class CustomCmdDbContext: CmsDbContext {

    static CustomCmdDbContext() {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<CustomCmdDbContext, Migrations.CustomCmdDbContext>()); …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework entity-framework-migrations

5
推荐指数
1
解决办法
2604
查看次数

当使用动态args链接方法时,为什么VS2010 IntelliSense会失败

我想对你的C#4.0动态专家进行一些解释.

我有一个流畅的构建器类来帮助在创建对象之前配置它.这个接口有一个方法SetParameters(...):

    public FluentBuilder<TInterface> SetParameters(dynamic parameters)
    {
        _parameters = parameters;
        return this;
    }
Run Code Online (Sandbox Code Playgroud)

我这样做是为了使用流畅的界面:

var order = new Order();

/* Setting up parameters */
dynamic parameters = new ExpandoObject();
parameters.Transaction = transactionObj;
parameters.CurrentPrincipal = Thread.CurrentPrincipal;

var proxiedOrder = ObjectProxyFactory
    .Configure<IOrder>(order)
    .FilterMethods(o => o.InsertOrder())
    .AddPreDecoration(AppConcerns.JoinSqlTransaction)
    .AddPreDecoration(AppConcerns.EnterLog)
    .AddPostDecoration(AppConcerns.ExitLog)
    .AddPostDecoration(AppConcerns.SecurityCheck)
    .SetParameters(parameters)
    .Teste() //this method doesn't exist in the fluent builder
    .CreateProxy();

var result = proxiedOrder.InsertOrder();
Run Code Online (Sandbox Code Playgroud)

如上面的片段中所述,名为Teste()的方法在fluent界面中不存在,但是在调用SetParameters之后,intelissense允许写任何方法,就像它返回动态一样,但正如你在代码中看到的那样,SetParameters返回非动态的FluentInterface .

上面的代码在运行时成功编译将失败,因为在运行时,在FluentBuilder类中找不到方法Teste().

要在设计时解决此问题,并获得正确的Intelissense,我需要将参数强制转换为ExpandoObject类:

var proxiedOrder = ObjectProxyFactory
.Configure<IOrder>(order)
.FilterMethods(o => o.InsertOrder())
.AddPreDecoration(AppConcerns.JoinSqlTransaction)
.AddPreDecoration(AppConcerns.EnterLog)
.AddPostDecoration(AppConcerns.ExitLog)
.AddPostDecoration(AppConcerns.SecurityCheck)
.SetParameters((ExpandoObject)parameters) //cast …
Run Code Online (Sandbox Code Playgroud)

c# visual-studio-2010 c#-4.0

1
推荐指数
1
解决办法
338
查看次数