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

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

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

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

C#

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

5535閲覧

外部キーを使用したデータの登録について

_panda_

総合スコア14

Entity Framework

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

C#

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2017/09/01 08:26

質問
ATimeをキーとしたテーブル1とテーブル2を作成しています。
テーブル1のデータを取得した際に、紐付くテーブル2のデータも取得することを目的としています。

現状、外部キーを利用した実装を考えていますが、後述の問題が発生します。

テーブル1
public class テーブル1
{
[Key, Column("日時", Order = 0)]
public DateTime ATime { get; set; }
[Column("回数")]
public int Count { get; set; }

public virtual ICollection<テーブル2> Mdl2 { get; set; }

}

テーブル2
public class テーブル2
{
[Key, Column("日時", Order = 0), ForeignKey("PMdl")]
public DateTime ATime { get; set; }
[Key, Column("No", Order = 1)]
public int No { get; set; }
public int Val { get; set; }

public virtual テーブル1 Mdl1 { get; set; }

}

問題1:外部キーを設定し、ナビゲーションプロパティに[ForeignKey("ATime")]を付与した場合
ビルド時に以下のエラーが発生します。
「リレーションシップ制約では Dependent および Principal Roles のプロパティ数は同じになる必要があります。」

問題2:外部キーを設定し、[ForeignKey("ATime")]を付与しない場合
保存時に以下のエラーが発生します。
「リレーションシップの外部キー プロパティを公開しないエンティティの保存中にエラーが発生しました。例外のソースとして単一のエンティティを特定できないため、EntityEntries プロパティは null を返します。エンティティ型で外部キー プロパティを公開すると、保存中の例外の処理が容易になります。詳細については InnerException を参照してください。」
「42703: column "テーブル1_ATime" of relation "テーブル2" does not exist」
SQLログを見ると、INSERT文の中にナビゲーションプロパティのデータ項目も入っていました。

外部キーを外して処理を行った場合、問題2と同じ状態になります。

問題解決方法、または、最初に記載した目的が達成できる他の方法がありましたら、ご教授願います。

環境は以下となっています。
Windows7
Framework:4.6
EntityFramework:6.1.3
EntityFramework6.Npgsql:3.1.1
Npgsql:3.2.3
Postgre:9.6

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

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

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

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

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

guest

回答2

0

自己解決

別の方法で対応することにしました。

投稿2017/10/17 11:46

_panda_

総合スコア14

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

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

退会済みユーザー

退会済みユーザー

2017/10/17 11:59

それならそれでもかまいませんので、具体的にどのようにしたのかを書いていただくようお願いします。このサイトは know-how の蓄積も目的にしているそうですので、ここを利用している方なら、情報提供の義務・・・とまでは言わなくても、協力はしていただければと思います。
guest

0

EF Code First の機能を使って DB を生成しようとしたがそれに失敗しているという状況ですか?

Npgsql は触ったこともないので、どこまで Microsoft の Code First の「規約」を守っているのか不明ですが、SQL Server であれば、以下の記事のようにすれば ForeignKey 属性の設定などはしなくても Code First の「規約」に従って DB のテーブルに FK 制約を設定してくれます。もちろんナビゲーションプロパティも有効になります。

EF でレコードの削除
http://surferonwww.info/BlogEngine/post/2015/12/21/entiry-framework-deleteion-of-records-in-tables-of-parent-child-relationship.aspx

記事のコードを見てください。Microsoft の文書「Code First の規約」(今はリンク切れで見つかりませんが)に書いてある "依存オブジェクトを表す型には、ナビゲーションプロパティに加えて外部キープロパティを含めることをお勧めします" に従って、Post クラスにはナビゲーションプロパティと外部キープロパティを定義しています。

そのコードをベースに EF Code First の機能を利用して DB を生成すると、上の記事の画像(SQL Server Management Studio で見たもの)のように Posts テーブルに BlogId というフィールドが生成され、FK 制約が設定されます。

Post クラスのナビゲーションプロパティと外部キープロパティは必須ではなく、例えば、上の記事の Post クラスからそれらを削除して以下のようにしても Posts テーブルに外部キーフィールドは生成されます。

public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } }

ただし、その場合は Posts テーブルの外部キーフィールド名は Blog_BlogId となり NULL 可になります(連鎖削除は設定されない)。

上記は全て Code First の「規約」によります。

Npgsql を利用しても「規約」通りになるなら、上に紹介した記事の通りにすれば同じ結果が得られるはずです。試してみてください。

投稿2017/09/02 06:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問