Entity Framework с Postgres приводит к «доступ к базе данных других пользователей» - PullRequest
0 голосов
/ 12 марта 2019

У меня есть приложение Winforms .NET C # в VS 2017, использующее Entity Framework 6, Postgres в качестве базы данных и EntityFramework6.Npgsql в качестве поставщика.

Вот мое app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="entityFramework" 
                 type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </configSections>
    <connectionStrings>
        <add name="myapp.Properties.Settings.mydbConnectionString" 
             connectionString="Host=localhost;Username=postgres;Password=testdbpass;Database=testdb;Pooling=false;" 
            providerName="Npgsql" />
    </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
    <entityFramework>
        <defaultConnectionFactory 
            type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <providers>
            <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
        </providers>
    </entityFramework>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Npgsql" publicKeyToken="5d8b90d52f46fda7" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

... и вот мой код:

   class NpgSqlConfiguration : DbConfiguration
    {
        public NpgSqlConfiguration()
        {
            var name = "Npgsql";
            SetProviderFactory(providerInvariantName: name, providerFactory: NpgsqlFactory.Instance);
            SetProviderServices(providerInvariantName: name, provider: NpgsqlServices.Instance);
            SetDefaultConnectionFactory(connectionFactory: new NpgsqlConnectionFactory());
        }
    }
    [DbConfigurationType(typeof(NpgSqlConfiguration))]
    public class TestContext : DbContext
    {
        public TestContext() : base("myapp.Properties.Settings.mydbConnectionString")
        {
            Database.SetInitializer<TestContext>(new ERPInitializer());
        }
        public DbSet<User> Users { get; set; }
    }

    public class ERPInitializer : DropCreateDatabaseAlways<TestContext>
    //public class ERPInitializer : DropCreateDatabaseIfModelChanges<ERPContext>
    {
        protected override void Seed(TestContext context)
        {
            base.Seed(context);
        }
    }


    public static class DBController
    {
        public static TestContext ErpContext = new TestContext();
        public static void PopulateBaseData()
        {
            try
            {
                using (var ctx = new TestContext())
                {
                    if (true)
                    {
                        ctx.Users.Add(new User() { UserName = "testuser", Name = "Test", Password = "testpasswd" });
                        ctx.SaveChanges();
                    }
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.ToString());
            }
        }
    }

Когда я нахожусь в режиме разработки и несколько раз запускаю приложение, после нескольких запусков я продолжаю получать исключения при попытке добавитьНовая запись в базе данных.Исключение говорит:

{"55006: к базе данных \" mydb \ "обращаются другие пользователи"}

... и как подробности исключения:

Detail = "Существует еще 1 сеанс с использованием базы данных."

Есть идеи, почему у меня возникают такие проблемы с подключением?

1 Ответ

1 голос
/ 14 марта 2019

Оказывается, основной причиной проблемы является соединение, которое поддерживается VS2017 при добавлении источника данных через меню «Проект -> Добавить новый источник данных».Когда мы добавляем этот источник данных в VS2017, а затем запускаем наше приложение, мы получаем ошибку «Существует 1 другой сеанс с использованием базы данных».Однако когда мы удаляем источник данных из VS2017, мы никогда не видим эту ошибку.

...