如何在ASP.NET 5 Beta 8控制台应用程序中使用EF7并连接到没有startup.cs的SQL Server?

时间:2015-10-28 04:24:54

标签: c# asp.net-core asp.net-core-mvc entity-framework-core

问题

我正在编写一个asp.net 5控制台示例应用程序,我想使用Entity Framework 7与我的后端进行通信。我知道如何在Web应用程序中执行此操作,但是如果在不使用startup.csmain.cs时如何为控制台应用程序完成此操作,我感到很遗憾。

代码

在Web应用程序中,您将在startup.cs中使用以下代码:

public void ConfigureServices(IServiceCollection services)
{
    var connection = @"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.AspNet5;Trusted_Connection=True;";

    services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));
}

这里有为entityframework7配置的服务和使用SQL Server的连接字符串。

尝试

我查看了GitHub,Google和Bing,但只找到了使用EF7的Web应用程序的示例项目和代码。我还没有找到与控制台应用程序讨论EF7的文档。

我想编写上面的代码,但是在我的main.cs中为我的控制台应用程序提供了代码。我没有成功,显然在main.cs中有以下内容:

SampleConsoleDbContext scab = new SampleConsoleDbContext();

我无法告诉我的程序连接字符串是什么,我仍然怀疑这是在main.cs中实例化上下文的正确方法。

对于有关此问题的任何帮助,建议或意见,我将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:7)

Microsoft实际上已开始为Entity Framework 7构建documentation

从他们的示例中,您可以通过覆盖OnConfiguring方法来内联配置上下文:

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder builder)
    {
        builder.UseSqlServer(@"<connection string>");
    }
}

然后您可以在Main中创建上下文的实例:

class Program
{
    static void Main(string[] args)
    {
        using (var db = new BloggingContext())
        {
            db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
            var count = db.SaveChanges();
            Console.WriteLine("{0} records saved to database", count);

            Console.WriteLine();
            Console.WriteLine("All blogs in database:");
            foreach (var blog in db.Blogs)
            {
                Console.WriteLine(" - {0}", blog.Url);
            }
        }
    }
}

在ASP.NET示例中,对.AddEntityFramework()的调用是允许EF使用与ASP.NET其余部分相同的服务提供程序(认为依赖注入)(这意味着EF将获得相同的记录器等)那个ASP.NET正在使用)。但如果您不想遵循该模式,那么您可以使用上面显示的方法。

答案 1 :(得分:2)

由于 heavyd 表示大部分内容不需要,只是为了设置DI,这也是我读代码的方式,可能是错误的。

至于设置连接字符串,您可以这么做:

var connection = @"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.AspNet5;Trusted_Connection=True;";

SampleConsoleDbContext scab = new SampleConsoleDbContext(connection);

将连接字符串传递给上下文。

您可以根据需要对此进行抽象,但这是将连接字符串传递给上下文实例的方法。