配置EF和Npgsql以进行代码优先。

4
我正在尝试让EF与Postgresql配合使用。如果可能的话,我想要使用Code-First迁移。到目前为止,我已经成功地运行了一个简单的ADO命令,所以我至少可以确定我的连接字符串是正确的。但是我无论如何都无法使EF代码迁移工作,并且我找不到任何最近的指南来帮助解决问题。
我使用NuGet引入了Npgsql、EntityFramework和EntityFramework6.Npgsql。我在pgadmin中创建了一个名为blogsample的空数据库。
当前,当我运行应用程序时,在第29行尝试将博客添加到数据库时,它会抛出异常:
An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in EntityFramework.dll
Additional information: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)

这是我的.cs文件:

using Npgsql;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Entity;
using System.Linq;


namespace NpgSqlTest
{
    class Program
    {
        static void Main(string[] args)
        {
            EFTest();

        }



        private static void EFTest()
        {
            using (var db = new BloggingEntities())
            {
                // Create and save a new Blog
                Console.Write("Enter a name for a new Blog: ");
                var name = Console.ReadLine();

                var blog = new Blog { Name = name };
                db.Blogs.Add(blog);
                db.SaveChanges();

                // Display all Blogs from the database
                var query = from b in db.Blogs
                            orderby b.Name
                            select b;

                Console.WriteLine("All blogs in the database:");
                foreach (var item in query)
                {
                    Console.WriteLine(item.Name);
                }

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }

        private static void ADOTest()
        {
            string ConnectionString = ConfigurationManager.ConnectionStrings["PostgresDotNet"].ConnectionString;

            using (NpgsqlConnection conn = new NpgsqlConnection(ConnectionString))
            {
                conn.Open();
                const string sql = "SELECT * from sample;";
                NpgsqlCommand cmd = new NpgsqlCommand(sql, conn);

                DataSet ds = new DataSet();
                using (NpgsqlDataAdapter adapter = new NpgsqlDataAdapter(cmd))
                {
                    adapter.Fill(ds);
                }

                int i = 0;
            }
        }
    }




    public class Blog
    {
        public int BlogId { get; set; }
        public string Name { get; set; }

        public virtual List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public virtual Blog Blog { get; set; }
    }

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

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // PostgreSQL uses the public schema by default - not dbo.
            modelBuilder.HasDefaultSchema("public");
            base.OnModelCreating(modelBuilder);
        }
    }    
}

以下是我的 App.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>

  <system.data>
    <DbProviderFactories>
      <!--for EF4.x and EF6.0.x -->
      <!--you may need this. if you don't modify machine.config-->
      <remove invariant="Npgsql" />
      <add name="Npgsql - .Net Data Provider for PostgreSQL" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=3.0.3.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />
    </DbProviderFactories>
  </system.data>


  <entityFramework>
    <providers>
      <!--for EF6.0.x -->
      <!--you need this. add it manually-->
      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
    </providers>
  </entityFramework>

  <connectionStrings>
    <add name="PostgresDotNet"
         connectionString="User ID=sava;Password=abc;Host=localhost;Port=5432;Database=blogsample;Pooling=true;"
         providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>
1个回答

4

您的上下文似乎没有使用您的连接字符串。请在上下文的构造函数中使用它:

public class BloggingEntities : DbContext
{

    public BloggingEntities()
        : base("PostgresDotNet") { }

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // PostgreSQL uses the public schema by default - not dbo.
        modelBuilder.HasDefaultSchema("public");
        base.OnModelCreating(modelBuilder);
    }
}   

http://fdevel.blogspot.com/2013/12/npgsql-with-entity-framework-6.html


你的回答链接到一个使用过时的Npgsql.Entityframework的帖子,相反我们应该使用EntityFramework6.Npgsql。 - user453441
随意编辑。也许这个链接?https://www.nuget.org/packages/EntityFramework6.Npgsql/ - Steve Greene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接