Breeze EFContextProvider Metadata()导致数据库未设定种子

Breeze EFContextProvider Metadata()导致数据库未设定种子,breeze,Breeze,在应用程序中,我正在构建客户端要做的第一件事就是请求breeze元数据。如果数据库不存在且entity framework需要创建数据库,则不会使用配置为database.SetInitializer的初始值设定项进行种子设定 如果其他内容触发EF首先对dbcontext执行查询,则数据库将按预期进行种子设定 我不确定这是一个bug还是出于某种原因 谢谢我很确定这个漏洞在你这边。首先,在创建和种子化数据库时检索元数据没有问题。一直这样做 您可以在任何Breeze Todo示例中看到这一点。请记住

在应用程序中,我正在构建客户端要做的第一件事就是请求breeze元数据。如果数据库不存在且entity framework需要创建数据库,则不会使用配置为database.SetInitializer的初始值设定项进行种子设定

如果其他内容触发EF首先对dbcontext执行查询,则数据库将按预期进行种子设定

我不确定这是一个bug还是出于某种原因


谢谢

我很确定这个漏洞在你这边。首先,在创建和种子化数据库时检索元数据没有问题。一直这样做

您可以在任何Breeze Todo示例中看到这一点。请记住,第一个Breeze客户端查询总是在处理查询之前请求元数据,因此对服务器的第一次调用(在这些示例中)总是请求元数据。如果元数据请求未能生成数据库,则这些示例将不起作用

Todos示例在类ctor(静态ctor)中以一种简单的方式初始化数据库并为其种子。这是完整的TodosContext.cs

名称空间Todo.Models{
使用System.Data.Entity;
公共类TodosContext:DbContext
{
//仅用于开发:初始化数据库
静态TodosContext()
{
SetInitializer(新的TodoDatabaseInitializer());
}
公共DbSet Todos{get;set;}
}
}
要看到它的作用:

  • 显示所有文件

  • 删除*App_Data/todo.sdf*数据库

  • 在该构造函数和Web API控制器的方法上设置断点

  • 使用调试(F5)运行。。。您将首先看到元数据端点,然后是这个静态构造函数

  • 查看Windows资源管理器中的*App_Data*文件夹,确认数据库已创建

  • 继续。。。您将看到Todos查询端点命中

  • 继续。。。屏幕上充满了种子TODO


  • 你做得怎么样?

    啊-你是对的。经过调查,我发现了这个问题。我在这里遵循了您的示例:忽略属性。第二个上下文没有使用正确的初始值设定项,所以我解决了这个问题。我知道OData使用[IgnoreDataMember]来实现这一点?你们有没有可能实现这个?
    namespace Todo.Models {
        using System.Data.Entity;
    
        public class TodosContext : DbContext 
        {
            // DEVELOPMENT ONLY: initialize the database
            static TodosContext()
            {
                Database.SetInitializer(new TodoDatabaseInitializer());
            }
            public DbSet<TodoItem> Todos { get; set; }
        }
    }