質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

2回答

25454閲覧

【C#】【Entityframework】DBの値を取得しようとすると例外が発生する

Ryukkef

総合スコア12

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2018/10/13 16:09

#環境
・VS2017 (.NetFramework4.6.1)
・C#
・Windows Form
・EntityFramework 6.2
・SQL Serverへのアクセス

#作成手順
SQL ServerにDBを作成し、幾つかテーブルを作成しました。
その後、ソリューションの新しい項目の追加
⇒ ADO.NET Entity DataModel
⇒ データベースからCode First
を選択しモデル、DBContextを作成しました。

#困っている事
作成されたDBContextのインスタンス生成後、

var hoge = context.MRiders.Local.ToList();
だったり
context.SaveChanges();
などをおこなったタイミングで、以下のような例外が発生しています。

System.InvalidOperationException: 'ADO.NET プロバイダーに、不変名が 'System.Data.SqlClient' の Entity Framework プロバイダーがありません。アプリケーションの構成ファイルの "entityFramework" セクションにプロバイダーが登録されていることを確認してください。詳細については、http://go.microsoft.com/fwlink/?LinkId=260882 を参照してください。

どのような設定をすれば、
例外を発生させずにテーブルからのデータ取得やデータの追加ができるようになるのでしょうか。

#調べてみた事
メッセージ通りですと、App.ConfigのentityFrameworkセクションにプロバイダーがないということでしたので、App.Configを見ました。
SQLServerを使用しているので、プロバイダーセクションにSQL Serverが設定されてあることは確認しました。

App.Config

1 <startup> 2 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> 3 </startup> 4 <entityFramework> 5 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework"> 6 <parameters> 7 <parameter value="System.Data.SqlServerCe.4.0" /> 8 </parameters> 9 </defaultConnectionFactory> 10 <providers> 11 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 12 </providers> 13 </entityFramework>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

⇒ データベースからCode First

そこは「データベースから EF Designer」を選ぶべきと思います。

「データベースから Code First」は、ウィザードで表示される説明にあるように "既存のデータベースに基づいて Code First モデルを作成します" というもの、つまり EF Code First の機能を使って DB を生成するためのコードを作成するためのもののはずです。(実際に使ってみると接続してデータを取得できるのですが、保証の限りではなさそうです)

これが今回の問題の原因かどうかは分かりませんが、まずはそこを直すことをお勧めします。

後は Visual Studio のウィザードに従って Entity Data Model を作って行けば、app.config への設定も含めて問題なく使えるコードが自動生成されるはずなのですが・・・

以下の記事の (1) ~ (10) と同じ手順で Windows Forms アプリケーションに Entity Data Model を作った際に自動生成された App.config のコードをご参考にアップしておきます。(記事は ASP.NET MVC のものですが、 (1) ~ (10) の手順は Windows Forms でも同じ)

スキャフォールディング機能
http://surferonwww.info/BlogEngine/post/2017/07/23/creating-controller-and-view-in-mvc-using-scaffolding-function.aspx

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> <connectionStrings> <add name="NORTHWINDEntities" connectionString="metadata=res://*/NorthwindEdm.csdl|res://*/NorthwindEdm.ssdl|res://*/NorthwindEdm.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local)\sqlexpress;initial catalog=NORTHWIND;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> </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="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> </configuration>

上手くいけば上に紹介した記事の「(10) 生成された EDM」の画像のように表示され、ソリューションエクスプローラーの .edmx ファイルの下には DbContext を継承したコンテキストクラス、データベースの各テーブルを表すモデルクラスも自動生成されます。

あとは、以下のようなコードを書くだけで、

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form4 : Form { private DataGridView dataGridView1; private BindingSource bindingSource1; private NORTHWINDEntities context; public Form4() { InitializeComponent(); this.dataGridView1 = new DataGridView(); this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; this.bindingSource1 = new BindingSource(); this.dataGridView1.DataSource = this.bindingSource1; this.Controls.Add(this.dataGridView1); this.context = new NORTHWINDEntities(); var data = from p in context.Products where p.CategoryID == 1 select new SelectedProducts { ProductID = p.ProductID, ProductName = p.ProductName, UnitPrice = p.UnitPrice }; this.bindingSource1.DataSource = data.ToList(); } } public class SelectedProducts { public int ProductID { get; set; } public string ProductName { get; set; } public decimal? UnitPrice { get; set; } } }

以下のように DB からデータを取得できます。

イメージ説明

投稿2018/10/14 04:00

編集2018/10/14 04:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

エラーメッセージで検索すると次のページがヒットしました。

クラスライブラリからEntity FrameworkでSQL Serverにアクセスするとエラー発生

曰く、EntityFramework.SqlServer.dllが無い事がエラーの原因らしく、Debugフォルダを確認すると確かに見当たらない。

記事を参考に1行追加して以下のように修正。

C#

1public class Class1 2{ 3 public static void AddTest() 4 { 5 //◆追加 6 var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance; 7 8 DataEntities e = new DataEntities(); 9 10 var b = new Book() { 11 //投入データ設定 12 }; 13 e.Book.Add(b); 14 e.SaveChanges(); 15 } 16}

投稿2018/10/13 21:42

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryukkef

2018/10/14 06:28

ありがとうございます。 これで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問