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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

Q&A

解決済

2回答

692閲覧

WebAPI で edmx を2つ目を追加する場合の方法

byori

総合スコア71

ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

0グッド

0クリップ

投稿2020/06/23 23:23

2つ目の 「ADO.NET Entity Data Model」 - 「データベースから EF Designer」 接続先、DBをセットし完了すると、初回の追加と異なり実行すると「Model1.edmz[Diagram1]」が表示され

「Entity Data Model Designer を使用すると、Entity Data Model を表示してデザインできます。
新しいエンティティモデルを作成するには、ツールボックスから項目をドラッグします。
既存のエンティティやリレーションシップをこのダイアグラムに追加するには・・・」

と出ました。初回追加時のようにデータベースの各テーブルがセットされないので、

Model1.edmz[Diagram1]上に追加でエンティティを作成し核プロパティに同じ項目を追加しました。
必要なテーブル分作成し、コンパイル後などにDbSetも追加されていました。

C#

1 using System; 2 using System.Data.Entity; 3 using System.Data.Entity.Infrastructure; 4 5 public partial class ReportLogEntities : DbContext 6 { 7 public ReportLogEntities() 8 : base("name=ReportLogEntities") 9 { 10 } 11 12 protected override void OnModelCreating(DbModelBuilder modelBuilder) 13 { 14 throw new UnintentionalCodeFirstException(); 15 } 16 17 public virtual DbSet<DoctorTable> DoctorTable { get; set; } 18 public virtual DbSet<ReportLog> ReportLog { get; set; } 19 }

これで実行してみると(エラー発生個所 #####)

C#

1 public class DataTablesController : ApiController 2 { 3 private ReportDataEntities db = new ReportDataEntities(); <- 初回に追加した edmx 4 private ReportLogEntities logDB = new ReportLogEntities(); <- 2つ目の追加 edms 5 6 : 7 8 // GET: api/DataTables/5 9 [ResponseType(typeof(DataTable))] 10 public async Task<IHttpActionResult> GetDataTable(int id) 11 { 12 DataTable dataTable = await db.DataTable.FindAsync(id); <- 初回の edmx は正しく読める 13 if (dataTable == null) 14 { 15 return NotFound(); 16 } 17 var list = await logDB.DoctorTable.FindAsync(5); <- 2つ目の edmx はエラー ##### 18「リモート サーバーがエラーを返しました: (500) 内部サーバー エラーです」 19 20 return Ok(dataTable); 21 }

クライアント側からの呼び出し

C#

1 var url = string.Format("http://localhost:51514/api/DataTables/GetDataTable/101"); 2 var req = (HttpWebRequest)WebRequest.Create(url); 3 req.Method = "GET"; 4 HttpWebResponse res = (HttpWebResponse)req.GetResponse(); <- ここを実行すると ##### でエラー

サーバー側の「ReportLogEntities logDB」の「logDB.DoctorTable」の結果ビューのメッセージに下記のようなエラーが出ていました。2番目に追加した edmx の追加方法がまずかったのでしょうか?

「指定されたスキーマが無効です。エラー:
Model1.msl(3,4) : エラー 2062: EntityContainer ReportLogEntities1 の EntitySet および AssociationSet のインスタンスにマッピングが指定されていません。」

教えてください。
VS2015 C# ASP.ET WEBAPI

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/24 00:45

2 つ目の追加が問題だったわけではなくて、2 つ目単独でも同じ問題が出るのではないですか? 試しに、新たに別のプロジェクトを作って、それに 2 つ目単独で EDM を生成して試してみたらどうなりますか?
退会済みユーザー

退会済みユーザー

2020/06/24 00:52

ASP.NET Web API のタグと表題「WebAPI で edmx を・・・」を見ただけで、中身を読まないでスルーする回答者が多いと思いますので、もっと一般的な質問内容にすることをお勧めします。 例えば、タグは C# とか多くの人に興味を引きそうなものもつけて、表題は「ADO.NET Entity Data Model を使って 2 つ目の EDM 作成」とかにして、コンソールアプリで問題を再現できるサンプルコードを提示するとか・・・
byori

2020/06/24 03:19

> 2 つ目の追加が問題だったわけではなくて、2 つ目単独でも同じ問題が出るのではないですか? このご指摘、正解でした。 別に作ったサンプル(初回登録)でも同様でしたので、サーバーのテーブルを確認しました。 うまくいく初回登録のテーブルと比較するとキー設定がされていませんでした。 Id がキーでなかった為、と考えられるので消して作り直したところうまくいくようになりました。 ありがとうございました。 > もっと一般的な質問内容にすることをお勧めします ご指摘ありがとうございます。注意します。
guest

回答2

0

初回追加時のようにデータベースの各テーブルがセットされないので、

2 つ目の DB に何か問題があったから「各テーブルがセットされない」ということになったのか、質問者さんのやり方の問題なのかわかりません。

だから、質問のコメント欄で「試しに、新たに別のプロジェクトを作って、それに 2 つ目単独で EDM を生成して試してみたらどうなりますか?」と書いたのですが、やってみましたか?

何しても、

Model1.edmz[Diagram1]上に追加でエンティティを作成し核プロパティに同じ項目を追加しました。

というところは、別のデータベースの EDM をプロジェクトに追加する手順としては普通ではないです。間違っているとまで言い切る自信はありませんが、そこが今回の問題の原因になっていると思います。(2 つ目単独で EDM を生成して試して問題がなければですが)

「各テーブルがセットされない」という問題として想像できるのは、同じフォルダに 2 つ目の EDM を作ろうとして、2 つ目のデータベースに 1 つ目のデータベースのテーブルると同名のテーブルがあるということです。

以前 Microsoft のサンプルデータベース Northwind と Pubs から 2 つの EDM を同じフォルダ内に生成しようとしたところ、両方のデータベースに sales という名前の同名のテーブルがあって、エンティティクラス(テーブルクラス)sales が先に作った方から消えてしまうという問題がありました。

解決方法はフォルダを別にすることです。

イメージ説明

そうすると名前空間が違うので、ザードは問題なく動いて EDM は期待通り生成できます。もちろん Linq to Entities を使ったコードも期待通り動きます。

フォルダを別にするということを試してみてください。(2 つ目単独で EDM を生成して試して問題がなければですが)

投稿2020/06/24 03:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

byori

2020/06/24 06:29

> 、それに 2 つ目単独で EDM を生成して試してみたらどうなりますか?」と書いたのですが、やってみましたか? 試しました。 >> 2 つ目の追加が問題だったわけではなくて、2 つ目単独でも同じ問題が出るのではないですか? > このご指摘、正解でした。 簡単な返事ですみません。 別サンプルを作成し試した結果、不具合のあった2つ目の追加の edmx は同じように追加されませんでした。結果は、同じになりました。データテーブルに問題があるかも!? ということで、それでデータテーブルの確認・・・となりました。 > 同名のテーブルがあるということです > フォルダを別にするということを試してみてください 「フォルダーを分ける」なるほど、そういう考え方があるのですね。 試してみます。ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/06/24 06:45

今回の話は、2 つ目のテーブルは主キーを持っていなくて、それからウィザードで EDM を作成しようとしたから問題が起こったと理解してます。それはフォルダを分けるのは解決策にはなりません。質問者さんは、2020/06/24 12:19 の回答のコメントで書かれた通り、主キーを追加して解決したと理解しています。 ただ、主キーがないと「テーブル/ビュー 'xxxxx' に主キーが定義されておらず、有効な主キーを推論できませんでした。このテーブル/ビューは除外されました。エンティティを使用するには、スキーマを確認し、正しいキーを追加して、コメントを解除する必要があります。」というエラーメッセージが出るはずなのですが、どうだったのでしょう? ビューから Entity Data Model 生成 http://surferonwww.info/BlogEngine/post/2011/04/24/Making-Entity-Data-Model-based-on-view.aspx
guest

0

自己解決

SurferOnWww 様のご指摘で解決に至りました。
ありがとうございます。

クローズできないのでこちらに投稿させていただきました。

投稿2020/06/24 03:24

byori

総合スコア71

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問