C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 複合主キーへの対応


(過去ログ 125 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■74446 / inTopicNo.1)  複合主キーへの対応
  
□投稿者/ ainax (17回)-(2014/12/30(Tue) 18:27:12)

分類:[データベース全般] 

C#, Visual Studio 2013 Commnunity Update4, EF6.0

お世話になります。

Entityframework のデータベースの設計についてご相談したいと思い投稿させて頂きました。

現在、 CSV からデータを読み込み Entityframewrok のモデルへとインポートするということをしています。

CSV の種類と項目は下記のような感じです。

【発注元CSV】
発注元コード, 発注元名
100, A社
101, B社
102, C社

【納品先CSV】
納品先コード, 納品先名, 発注元コード, 発注元名
1, 東京, 100, A社
2, 千葉, 100, A社
3, 神奈川, 100, A社
1, 東京, 101, B社
2, 神奈川, 101, B社
3, 長野, 101, B社
1, 東京, 102, C社
2, 北海道, 102, C社

【オーダーCSV】
オーダーNo, オーダー詳細No, 発注元コード, 発注元名, 納品先コード, 納品先名
10001, 1, 100, A社, 1, 東京
10001, 2, 100, A社, 2, 千葉
10002, 1, 101, B社, 1, 東京
10003, 1, 102, C者, 2, 北海道
10004, 1, 100, A社, 0, (空文字)

上記の CSV のインポート先に下記のようなモデルを使っています。

class 発注元
{
   [Key]
   public int コード {get; set;}
   public string 名前 {get; set;}

   public virtual ICollection<納品先> 納品先s {get ;set;}
}

class 納品先
{
   [Key, Column(Order = 0)]
   public int コード {get; set;}
   [Key, Column(Order = 0)]
   public int 発注元コード {get; set;}
   public string 名前 {get; set;} 
   
   [ForeignKey("発注元コード")]
   public virtual 発注元 発注元 {get ;set;}
   public virtual ICollection<オーダー> オーダーs {get; set;}
}

class オーダー
{
   [Key, Column(Order=0)]
   public int オーダーNo {get; set;}
   [Key, Column(Order=1)]
   public int オーダー詳細No {get; set;}
   [ForeignKey("納品先"), Column(Order=2)]
   public int 発注元コード {get; set;}
   [ForeignKey("納品先"), Column(Order=3)]
   public int 納品先コード { get; set;}
   
   public virtual 納品先 納品先 {get; set;}
}

処理的には、オーダー CSV から発注元コードと納品先コードの組み合わせを全て抽出し、
発注元モデルと納品先モデルへと登録後、

改めて、オーダー CSV の発注元名と納品先名を除いた No とコードを上記のモデルに入れています。

理想的には、下記のようなオーダーモデルに入れて、

class オーダー
{
   [Key, Column(Order=0)]
   public int オーダーNo {get; set;}
   [Key, Column(Order=1)]
   public int オーダー詳細No {get; set;}

   public virtual 発注元 発注元 {get; set;}   
   public virtual 納品先 納品先 {get; set;}
}

オーダーからの発注元と納品先の情報の取得を分かりやすくしたいのですが、
発注元はともかく納品先が複合キーになっているので、出来ない状態です。

なにか Fluent API 等で対処できるといいなと思って探っている状態なのですが・・・

もっと良いモデルの設計や、Fulent API の設定等で何かあれば、ご助言を頂けると幸いです。

宜しくお願い致します。

引用返信 編集キー/
■74448 / inTopicNo.2)  Re[1]: 複合主キーへの対応
□投稿者/ WebSurfer (450回)-(2014/12/31(Wed) 16:31:11)
No74446 (ainax さん) に返信

質問内容がよく理解できなくてすみませんが・・・

> 処理的には、オーダー CSV から発注元コードと納品先コードの組み合わせを全て抽出し、
> 発注元モデルと納品先モデルへと登録後、
>
> 改めて、オーダー CSV の発注元名と納品先名を除いた No とコードを上記のモデルに入れています。
>
> 理想的には、下記のようなオーダーモデルに入れて、

そもそも、「理想的には」の前のところまでは、EF Code First による SQL Server DB のテーブル生
成とモデルを利用した CSV データの SQL Server DB のテーブルへの登録は期待通りできているので
しょうか?

そうではなさそうな感じがします。違ってたら失礼しました。
引用返信 編集キー/
■74451 / inTopicNo.3)  Re[2]: 複合主キーへの対応
□投稿者/ ainax (18回)-(2015/01/03(Sat) 16:17:54)
No74448 (WebSurfer さん) に返信
あけましておめでとうございます。

まずはお返事が遅れたことお詫び申します。

質問内容が・・・とのことでしたが、
実は自分でも質問を書いていて、質問自体がうまくまとまってない状態で書いておりました。

一言で言ってしまえば、このようなデータ構造で合っているのかどうか?ということでした。

さらに、「理想的には・・・」のくだりについては、後々よく考えて見ると、リレーション的には
無理、というかそのようなリレーションの構造はあり得ないのではと現在考えております。

データ構成的には

オーダー ← 発注元
 ↑
納品先

ですが、リレーションで考えると

オーダー ← 納品先 ← 発注元

ではないかと思っています。
そうすると、現在のコードで問題ないのかなと考えるようになりました。

また、CSV の SQL Server Db への登録についてですが、
とりあえず、現在登録はできています。
(CSV より発注元登録 → 納品先登録 → オーダーへ登録という最大 3 回の Insert into を発行しています。)

未だ ForeignKey についてプロパティについていたり、ナビゲーションプロパティについていたりで
その部分の理解があいまいなので、その部分から理解をしていきたいと思います。

また、理解に躓くことがあれば改めてご質問させて頂ければと思います。

どうもありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -