EF CodeFirst についての質問

このQ&Aのポイント
  • Entity Framework Code Firstについての質問です。
  • 既存のデータベースから移行する際に複数の外部キーを同テーブルから参照する場合のEntityクラスの書き方を教えてください。
  • 検索しても解決策が見つからないため、お助けいただきたいです。
回答を見る
  • ベストアンサー

EF CodeFirst についての質問

entity framework code first についての質問です。 既存のデータベースから移行するときに詰まってしまいました。お助けください。 複数の外部キーを同テーブルから参照している場合Entityクラスにはどう外部キーを書けばいいのでしょうか? 例 class Store{ public int StoreId {get;set;} public int UserId {get;set;} public int UserId2 {get;set;} * この部分です public virtual User User {get;set;} } class User{ public int UserId {get;set;} public int Name {get;set;} public virtual ICollection<Store> Stores { get; set; } } いろいろ検索して調べてみたのですが解決できませんでした。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • onos
  • ベストアンサー率81% (127/155)
回答No.1

http://my-clip-devdiary.blogspot.jp/2011/01/aspnet-mvc-3entity-framework-code.html Fluent APIで実装してる例、かな? 既存のDBがあるならCodeFirst使うよりDBファーストでモデルつくって、必要ならそこからPOCOクラスを生成させたほうが楽な気がします。

negaga
質問者

お礼

ありがとうございます まさにこれが知りたい情報でした

関連するQ&A

  • interface プロパティ

    【ケース1】 class Class1 { public string str { get; set; } public int x { get; set; } } 【ケース2】 class Class1 : Class2, Class3 { public string str { get; set; } public int x { get; set; } } interface Class2 { int x { get; set; } } interface Class3 { string str { get; set; } } インターフェースのプロパティの実装をしています、【ケース2】です。 これと【ケース1】ってどこがどう違うのでしょうか?何か同じな感がぬぐえません class2とclass3のプロパティを再定義してるという感がしません。。 実装の仕方がまちがってる場合はご指摘ください。お願いします。

    • ベストアンサー
    • Java
  • C#クラスについて教えてください

    下記通りクラスを作成した場合、プロパティaを配列にできますか? class Class1 { public string a { set; get; } public int b { set; get; } public int c { set; get; } } イメージとしては下記通りにしたいのですが、なかなかうまく行きません。 class Class1 { public Class1(int x) { } public string a[x] { set; get; } public int b { set; get; } public int c { set; get; } } private void Form1_Load(object sender, EventArgs e) { Class1 f = new Class1(2); f.a[0] = "asdf"; f.a[1] = "asdfa"; f.a[2] = "asdfasd"; f.b = 1; f.c = 2; } 初心者なんで、やさしく教えてください。お願いします。

  • 永続化前後のクラスの表現について C#

    ものすごくくだらない質問ですみません。 リレーショナルデータベースを使わざるを得なく、O/Rマッピングツールは使えない状況です。 class Employee があります。 StaffCodeがありますが、将来このコードが重複はありませんが変わる可能性があるので永続化を目的としてこれを主キーとして使えません。 そこで主キーにサロゲートキーを使おうと考えました。 アプリ側で対応するよりもデータベース側でオートナンバーを使います。 一応下記コードでこれから採番する社員と、永続化&採番したあとの社員を表現する事はできます。 しかし同じクラスを使うものなのでしょうか? クラスを分けるべきでしょうか? そもそも考え方がおかしいですか? Class Employee { Public Int Id { get; private set; } Public String Name { get; private set; } Public Int StaffCode { get; private set; } Public Employee(String name, Int staffCode) { this.Name = name; this.StaffCode = staffCode; } Public Employee(Int id, String name, Int staffCode) { this.Id = id; this.Name = name; this.StaffCode = staffCode; } Public Void SetId(Int id) { this.Id = id; } }

  • C#でレート別に管理するクラスを作りたい

    本の管理をするアプリを作っている時にまた疑問が出てきました。 public class Book { public string Title { get; set; } public string ISBN { get; set; } public Money Money { get; set; } public int Rate { get; set; } public DateTime BuyDate { get; set; } } 本の管理にレートをつけられるようにしようと思っています。 iTunesの★マークのようなものにしたいので1~5の固定です。 つけていないものもあるので0も存在します。 ここでレートを付けている本を、それぞれのレート別にグループに分けたいと思いました。 そこでレート1~レート5までのグループをどのように管理するのがベストというか、どのように考えればいいのでしょうか。 私が考えたのは、グループ別に処理が分かれるのでクラスを作った方がいいと考えたのです。 とりあえず同じ処理もいくつか発生するので public abstract class AbstractRate { public int Value { get; set; } private static BookCollection _bookCollection; //全ての本が入る public BookCollection BookCollection { get { return _bookCollection; } } } みたいな基底クラスを作り public class Star1 :AbstractRate { private BookCollection _books; } から Star5までの似たようなクラスを作り、それぞれのレートのBookコレクションを持たせる形です。 ただこれだと同じようなクラスが増えるだけでものすごく冗長だと思うのです そこでもう一つ思ったのは public class GroupClass { public string GroupName { get; set; } public BookCollection BookCollection { get; set; } } という形でグループ名と本のリストを入れておく形です。 これだとクラスは分かりやすくていいのですが、毎回処理をさせる際にこの名前のグループならこれみたいな処理が必要になる気がして悩んでいます。 実際どのように考えるのがいいのでしょうか? 直接的な回答でなくてもいいのですが、考える材料が欲しいです。 よろしくお願いします。

  • boost::shared_ptr::getにて

    こんにちは。 C++で書かれたプログラムの保守をしています。 以下のような感じで書かれたクラスがあります。 class Foo { public :   Foo(){} ;   virtual ~Foo(){} ;   void Set( boost::shared_ptr< int > pValue )   {     _pValue = pValue.get() ;   } protected :   void* _pValue ; } ; このクラスから _pValue を再び boost::shared_ptr< int > にして取得するにはどうしたら良いのでしょうか? 強引に、 boost::shared_ptr< int > Get( void ) {   boost::shared_ptr< int >  temp ;   temp.reset( (int*)_pValue ) ;   return temp ; } とやっても案の定ダメでした。 void* _pValue の部分はいろいろ使われていて変更できません。 何かよい手段はないものでしょうか?

  • C++基底クラスに戻り値の異なる関数が宣言されている場合

    こんにちは。 質問させてください。 以下のようなコードがあったとします。 class Base1 { public:   virtual int get()=0; }; class Base2 { public:   virtual float get()=0; }; class Ex : public Base1, public Base2 { public:   int get(){return 0;}   float get(){return 0.0f;} }; void main() { } このプログラムをコンパイルすると 「'Ex::get': オーバーライドする仮想関数の戻り値の型が異なり、'Base1::get' の covariant ではありません。」 というエラーが出てしまいます。 関数の名前と引数が同じで戻り値だけが異なる場合はエラーが出るのはわかるのですが、基底クラスのBase1、Base2は変更不可能だとするとどのように回避すればいいのでしょうか? よろしくお願いします。 /*   WindowsXP Professional SP3   VisualStudio2005 AcademicEdition */

  • 複数のテーブルのレコードを DELETEする方法 ( 外部参照 テーブル )

    バージョンは、8.1.5 です。 下記のように外部参照された 2つのテーブルがあります。 userテーブル  --------------------  userid   | integer  passwd  | text  -------------------- user_rel_groupテーブル  ---------------------  userid  | integer  gatid   | integer  --------------------- Foreign-key constraints: "user_rel_group_userid_fkey" FOREIGN KEY (userid) REFERENCES user(userid) そこで、 userテーブルからユーザーを削除した場合、 => DELETE from user where userid = 10030118; ERROR: update or delete on "user" violates foreign key constraint "user_rel_group_userid_fkey" on "user_rel_group" DETAIL: Key (userid)=(10030118) is still referenced from table "user_rel_group". とエラーがでますが、【 MySQL 】ではDELETE文にて、 DELETE member, user_rel_group FROM user LEFT JOIN user.userid = user_rel_group.userid WHERE userid = 10030118; のようにテーブルを結合して、複数のテーブルのレコードを削除できるようですが、 PostgreSQLは、出来ますでしょうか? また、 テーブル作成時に、 CREATE TABLE user_rel_group (   userid integer, ....   constraint group_user_foreignkey   foreign key(userid) references user(userid) on delete cascade ); と、制約が必須だったのでしょうか? どなたかご教授お願い致します。

  • LINQでn:nテーブルを階層オブジェクトに

    お世話になっております。 表題のテーマについて、理解いただける方にアドバイスお願いします。 会員を表すMembersというテーブル、 種別を表すTypesというテーブル、 会員と種別を結び付けるMemberTypeBindsというテーブルがあって、会員・種別がn対nで定義されています。 Membersの件数は200件ほど、Typeは20件程度。だいたいMembersは1~5くらいのTypeに紐づいています。 Table Members int ID(主キー, autoIncrement) varchar(20) MemberName Table Types int ID(主キー, autoIncrement) varchar(20) TypeName Table MemberTypeBinds int memberID(外部キー, MembersのID) int typeID(外部キー, TypesのID) これを、LINQで下記のクラスオブジェクトに抽出したいと思っています。 今は全件表示でもいいですが、そのうちページングで表示する必要がでてくると思います。 public class MemberTypes {  public Member member { get; set; }  public List<Type> types { get; set; } } どうやるかがわかりません。LINQはこんな感じだと思うのですが、 public List<MemberTypes> GetMemberTypes(){  using (var dc = new DataContext()){   var result = dc.MemTypeBinds    .GroupBy(mt=>mt.Member)    // このあと、どうやったらいいかがわかりません。    // DBから階層化オブジェクトを生成するのは    // けっこう頻出のテーマだと思うので、しっかりマスターしたいです。   }).ToList();   return result;  } } LINQに詳しい方、お助けください。

  • デザインパターン?

    以下の例1のようなことと、 同じ親クラスを継承することなく(例2のような形で)、実現するのは、 何というデザインパターンでしょうか? //------------------------ ◆例1:普通の実装 //データ操作の抽象クラス Class DataManagementInterface virtual get_data(std::string) = 0 //データ操作(データベース) ※戻り値はデータテーブルクラス Class DBManagement : DataManagementInterface virtual data_table_class get_data(std::string) //データ操作(ファイル) ※戻り値はファイルクラス Class FileManagement : DataManagementInterface virtual file_class get_data(std::string) //------------------------ ◆例2:インタフェースを統合するようなイメージの実装 //データ操作(データベース) Class DBManagement virtual void* get_data(std::string) //データ操作(ファイル) Class FileManagement virtual get_data(std::string) Class DataManagementInterface virtual get_data(std::string, int 操作区分) get_dataの実装    if 操作区分が1なら、       DBManagementのget_data    else if       操作区分が2なら、FileManagementのget_data //------------------------ また、ちなみにですが、 後者の方法で、戻り値が不定(データテーブルクラスか、ファイルクラスを返す) ことは不可能という認識ですが、「できない」で合ってますか? .

  • クラス作成

    C#にてクラス作成をしております。その中で疑問に思った点を質問させていただきます。 画像を枠内に表示させるクラス 実装すべき変数:枠番号、パス、 映像を枠内に流すクラス 実装すべき変数:枠番号、パス、再生時間 Flashを枠内に流すクラス 実装すべき変数:枠番号、パス など色々なクラスがあってそれをまとめたクラスを作成中です。 上記のクラスを実装するにあたって、共通の変数はクラスにしてしまい それを継承しましょうと言う指示がありました。これはどういった使い方をするものなのでしょうか? class Class2 { public int no { get; set; } public string path { get; set; } } class Movie : Class2 {    public float time{get;set;} public void Play(int frameNo, string path, float playtime){} } class Picture: Class2 {    public void Show(int frameNo, string path){} } これをForm1.cs内で Class2 cls = new Class2(); cls.path = "C:\\test"; cls.no = 11; とかすれば MovieやPictureで使いまわしができると思いきや MovieやPictureをNewすれば初期化されてしまう為、何か根本的に 私の考えが間違ってると思います。 共通の変数を別のクラスにしておいて継承して使うというのはどういった使い方をするのでしょうか? よろしければ例で教えていただけないでしょうか

専門家に質問してみよう