C# Интерактивная и Entity Framework

Я пытаюсь запустить метод в C# Interactive, который возвращает некоторые данные из локальной базы данных, используя Entity Framework. Но он возвращает ошибку о том, что строка подключения с именем "InteractiveConsoleDBEntities" может быть найдена в файле конфигурации приложения. Я использую базу данных в первую очередь. Я использую опцию "Initialize Interactive with project", чтобы начать с C# Interactive.

Вот подробности...

Команды в интерактивной консоли

#r "C:\Users\Path\InteractiveConsole\packages\EntityFramework.5.0.0\lib\net45\EntityFramework.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.ComponentModel.DataAnnotations.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Core.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.Entity.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Runtime.Serialization.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Security.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.Linq.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.DataSetExtensions.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Microsoft.CSharp.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll"
#r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.dll"
#r "InteractiveConsole.exe"
using InteractiveConsole;
using InteractiveConsole.Model;
using InteractiveConsole.DAL;
var context = new InteractiveConsoleDBEntities();
context.Employees.ToList();

Тогда я получаю ошибку

No connection string named 'InteractiveConsoleDBEntities' could be found in the application config file.
  + System.Data.Entity.Internal.LazyInternalConnection.get_ConnectionHasModel()
  + System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
  + System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(System.Type)
  + InternalSet<TEntity>.Initialize()
  + InternalSet<TEntity>.Include(string)
  + DbQuery<TResult>.Include(string)
  + System.Data.Entity.DbExtensions.Include<T>(IQueryable<T>, string)
  + System.Data.Entity.DbExtensions.Include<T, TProperty>(IQueryable<T>, Expression<Func<T, TProperty>>)
  + InteractiveConsole.DAL.EmployeeDAL.GetEmployeeList()

Файл App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v13.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <connectionStrings>
    <add name="InteractiveConsoleDBEntities" connectionString="metadata=res://*/Model.Model.csdl|res://*/Model.Model.ssdl|res://*/Model.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|DataDirectory|\DB\InteractiveConsoleDB.mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

DbContext

namespace InteractiveConsole.Model
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class InteractiveConsoleDBEntities : DbContext
    {
        public InteractiveConsoleDBEntities()
            : base("name=InteractiveConsoleDBEntities")
        {

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public DbSet<Employee> Employees { get; set; }
        public DbSet<Person> People { get; set; }
    }
}

Класс с методом

using System.Data.Entity;

namespace InteractiveConsole.DAL
{
    public class EmployeeDAL
    {
        public static List<Employee> GetEmployeeList()
        {
            using (var context = new InteractiveConsoleDBEntities())
            {
                return context.Employees.Include(x => x.Person).ToList();
            }
        }
    }
}

Тот же проект в Immediate Window работает нормально

InteractiveConsole.DAL.EmployeeDAL.GetEmployeeList()
Count = 2
    [0]: {System.Data.Entity.DynamicProxies.Employee_0D99EB301BB74EDFF2203163D6E8A936C70F24995F1639BF58D81DCCA671DEC0}
    [1]: {System.Data.Entity.DynamicProxies.Employee_0D99EB301BB74EDFF2203163D6E8A936C70F24995F1639BF58D81DCCA671DEC0}

Надеюсь, кто-нибудь знает, что я делаю неправильно, и может мне помочь.

большое спасибо

1 ответ

Я боролся с этим какое-то время, прежде чем я наконец заработал.

Создайте новый частичный класс (например, с именем YourEntities.cs) с новой перегрузкой для вашего конструктора, который принимает параметр строки подключения (не изменяйте существующий класс, поскольку он будет перезаписан всякий раз, когда вы будете повторно моделировать базу данных):

using System.Data.Entity;

namespace YourNamespace.Models
{
    public partial class YourEntities : DbContext
    {
        public YourEntities(string connectionString)
            : base(connectionString)
        {
        }
    }
}

Затем создайте свой проект, щелкните его правой кнопкой мыши и выберите "Инициализировать интерактив с проектом". Откройте файл web.config / app.config и скопируйте строку подключения в буфер обмена.

В интерактивном окне вставьте эту замену ConnStringHere со строкой подключения, но не нажимайте Enter:

var db = new YourNamespace.Models.YourEntities("ConnStringHere");

После вставки замените &quot; в строке соединения с \", перейдите в конец строки в C# интерактив и нажмите Enter.

Тогда вы сможете использовать db в интерактивном окне C# так, как если бы оно было в вашем приложении:

Print(db.Employees.Count());

Я понимаю, что это старо, но я нашел способ заставить это работать без изменения моего кода или создания прокси или другого обходного кода. Я смог сделать эту работу, отредактировав сам файл конфигурации для интерактивного окна. Смотрите мой ответ в этом посте:

Проект не может найти мою строку подключения EF в C# Interactive

Возможно, вам придется добавить и другие данные конфигурации, если ваше приложение использует их. Для меня достаточно было просто добавить строку подключения.

Другие вопросы по тегам