簡體   English   中英

C#互動和實體框架

[英]C# Interactive and Entity Framework

我試圖運行在C#互動的方法,從本地返回一些數據DB使用實體框架。 但是它返回一個錯誤,指出可以在應用程序配置文件中找到名為“ InteractiveConsoleDBEntities”的連接字符串。 我首先使用數據庫。 我使用選項“初始化互動與工程”,開始用C#互動。

這是詳細信息...

交互式控制台中的命令

#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();
            }
        }
    }
}

立即窗口中的同一項目工作正常

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

希望有人知道我做錯了什么,可以為我提供幫助。

非常感謝

在我終於使它工作之前,與它奮斗了一段時間。

為構造函數創建一個帶有連接字符串參數的新重載的新局部類(例如,名為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。

然后,您應該能夠在C#Interactive窗口中使用db,就像在應用程序中一樣:

Print(db.Employees.Count());

我意識到這很舊,但是我找到了一種無需更改代碼或創建任何代理或其他解決方法的代碼即可完成此工作的方法。 我可以通過編輯交互式窗口本身的配置文件來完成這項工作。 看到我在這篇文章中的答案:

項目無法找到C#互動我的EF連接字符串

如果您的應用程序依賴於它,那么您可能還必須添加其他配置數據。 對我來說,僅添加連接字符串就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM