4

我正在阅读 Julia Lerman 和 Rowan Miller 所著的“Programming Entity Framework: DbContext”一书。

我已经从http://www.thedatafarm.com/learnentityframework/downloadfiles/dbcontext/StartingSolution.zip下载了“BAGA”解决方案。我觉得这里是一个完整的工具,因为我无法让任何代码示例在我的计算机上运行。

通常,当我使用实体框架时,我的配置中有一个连接字符串,它告诉实体框架要连接到什么数据库以及要使用什么凭据。

但是,在这个 BAGA 解决方案中,我在解决方案的任何地方都找不到连接字符串或对数据库的引用。我猜代码应该全部在本地或类似的地方运行,但是当我输入并运行任何示例查询或更新时,计算机会暂停大约 20 秒,然后从SaveChanges方法中抛出以下异常:“提供者未返回 ProviderManifestToken 字符串”。

我猜这个解决方案应该使用内部数据库,或者我应该在某处键入连接字符串,但我没有看到它在书中的哪个位置告诉我如何使这个解决方案工作。

它明确指出该解决方案使用 EF Code First。

BAGA 中的控制台应用程序代码如下所示:

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Text;
using DataAccess;
using Model;

namespace BreakAwayConsole
{
  class Program
  {
    static void Main(string[] args)
    {
      Database.SetInitializer(new InitializeBagaDatabaseWithSeedData());

      // Call the latest example method here

      // NOTE: Some examples will change data in the database. Ensure that you only call the 
      //       latest example method. The InitializeBagaDatabaseWithSeedData database initializer 
      //       (registered above) will take care of resetting the database before each run.

      AddMachuPicchu();

    }

    // Add example methods here

    private static void AddMachuPicchu()
    {
        using (var context = new BreakAwayContext())
        {
            var machuPicchu = new Destination
            {
                Name = "Machu Picchu",
                Country = "Peru"
            };
            context.Destinations.Add(machuPicchu);
            context.SaveChanges();
        }    
    }    
  }
}

正如@Wyktor Zychla 所问,这是 BreakAwayContext.cs 的代码:

using System.Data.Entity;
using Model;

namespace DataAccess
{
  public class BreakAwayContext : DbContext
  {
    public DbSet<Destination> Destinations { get; set; }
    public DbSet<Lodging> Lodgings { get; set; }
    public DbSet<Trip> Trips { get; set; }
    public DbSet<Person> People { get; set; }
    public DbSet<Reservation> Reservations { get; set; }
    public DbSet<Payment> Payments { get; set; }
    public DbSet<Activity> Activities { get; set; }
  }
}

正如您在此处看到的,没有指定构造函数。

4

2 回答 2

1

在其他地方找到了一个解决方案,并在这里为购买书籍时遇到相同问题的任何人添加它。要实现这一点,请将连接字符串添加到 BreakAwayConsole 项目中的 App.config 文件:

<connectionStrings>
    <add name="BreakAwayContext"
        providerName="System.Data.SqlClient"
        connectionString="Server=localhost;Database=Baga;Integrated Security=True;"/>
  </connectionStrings>

并在您的 BreakAwayConsole Program.cs Main() 方法中:

Database.SetInitializer(new InitializeBagaDatabaseWithSeedData());
var ctx = new BreakAwayContext();
ctx.Database.Initialize(true);

请参阅提供上述解决方案的此线程:Entity Framework Database.SetInitializer 根本不起作用

于 2013-09-04T00:38:31.767 回答
0

那应该很简单。查找具有 BreakAwayContext 类型的代码并查找其构造函数。它们要么提供显式连接字符串,要么使用连接字符串名称。

在这两种情况下,您都可以轻松创建适当的数据库。

于 2013-05-29T21:42:42.983 回答