1 名前:デフォルトの名無しさん mailto:sage [2016/07/10(日) 00:34:49.34 ID:2YnnBC7F.net] 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、 質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■前スレ ふらっと C#,C♯,C#(初心者用) Part121 echo.2ch.net/test/read.cgi/tech/1465958068/ ■関連スレ C#, C♯, C#相談室 Part91 echo.2ch.net/test/read.cgi/tech/1467142749/ ■コードを貼る場合は↓を使いましょう。 ideone.com/ https://dotnetfiddle.net/ ■情報源 https://msdn.microsoft.com/en-us/library/gg145045.aspx referencesource.microsoft.com/
970 名前:デフォルトの名無しさん mailto:sage [2016/07/30(土) 20:28:38.81 ID:Nl6hflxM.net] >>952 その場合は、クラスAの定義にBの外部キーとなるための項目(BId)が必要なはず クラスBにもAへの外部キー(AId)が必要
971 名前:953 mailto:sage [2016/07/30(土) 22:10:21.29 ID:Nl6hflxM.net] n:nのリレーションだったな >>954 はとりあえず忘れて 軽く試してみたけど、EF6.1.3だとちゃんと中間テーブル作成されて値も入る (IDがオートナンバーになったから、指定した値ではないが) DbContextの定義とデータ追加してるコードどっかに晒してみたら?
972 名前:デフォルトの名無しさん mailto:sage [2016/07/30(土) 23:10:44.57 ID:flo7DdHH.net] .net 4.0 4.5 4.5.1は既にサポート終了してたんだな。2.0はシェアの多さからまだサポート続いてるな。
973 名前:デフォルトの名無しさん mailto:sage [2016/07/30(土) 23:18:52.42 ID:3zYE6jXl.net] >>956 4.5ならともかくうちの会社は4.0のアプリが多いから互換チェックが大変だわ
974 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 09:28:55.80 ID:fxXPyGX0.net] C#って配列を初期化しないとエラーがでるけど、これって初期化してからじゃないと 配列の実態を生成できないからでしょうか?C言語だとint a[100];の時点で作られるから エラーがでないと思ってますけどそういうことでしょうか?
975 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 09:49:03.77 ID:DiaxdW8Z.net] >>958 値型の配列を参照型の配列の違い C#でも fixed char name[30]; を使えば値型配列を作れる(ただしC等とのDLL連携用に作られたものなので普通はしない) {"a","b","c"}を例にすると画像みたいになる sssp://o.8ch.net/ewpj.png
976 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 09:49:48.65 ID:VGHB1MRw.net] 初期化という言葉はC#では意味が曖昧になる状況が多いから、正しく理解するまでは使わないほうがいい C#で配列を作るとき int[] a = new int[100]; 1-1. int[]型のローカル変数aを確保する。 1-2. int[]型で100要素をもつ配列オブジェクトを生成する。このとき要素の値はすべて既定値(0)で自動的に”初期化”される。 1-3. 1-2.で作ったオブジェクトの参照をaへ代入する。 Cならこうだ int a[100] = {0}; 2-1. int[100] 型のローカル変数を確保する。この時点で100要素分確保されている。 2-2. aの全要素を0で”初期化”する。 で、>>958 が初期化と呼んでいるのは(1-2.+1-3.)と2-2のことだろう。 これを理解してれば何も不思議はないはず。
977 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 09:52:22.29 ID:DiaxdW8Z.net] ちなみに文字列型は参照型だから上みたいになるけど、値型ならこうなる ここでは例として{1,2,3}を使う sssp://o.8ch.net/ewpn.png
978 名前:デフォルトの名無しさん [2016/07/31(日) 10:22:20.63 ID:fxXPyGX0.net] >>959 Cの場合スタックとヒープで容量いっしょ?www C#との違いに驚いた
979 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 10:30:11.19 ID:JeOzAbnd.net] sssp見えない
980 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 10:32:05.95 ID:DiaxdW8Z.net] スタックは仕組み上固定長じゃないと駄目な訳 構造体が継承できないのもそこら辺の問題 もし値型が継承しちゃったら固定長じゃなくなるよね?
981 名前:デフォルトの名無しさん [2016/07/31(日) 10:38:24.44 ID:fxXPyGX0.net] >>959 あ読み間違いか ヒープ領域にa,b,cがあるかと思った →ってことねw
982 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 10:42:24.41 ID:DiaxdW8Z.net] >>965 ヒープ領域にa,b,cがあるよ スタックは固定長じゃないといけないのに、もし文字列にスタックがあったら string s="a"; s="aa"; みたいな事したらぶっ壊れるぞ
983 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 10:46:58.10 ID:VGHB1MRw.net] >>964 んなことはない C99ならスタックに可変長配列置けるぞ そもそもスタックはコールスタックという可変長のデータ領域を扱うためのものなんだから仕組み上何も無理はない
984 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 10:50:21.98 ID:DiaxdW8Z.net] >>967 あ、マジで すまん俺の勘違いだわ
985 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 10:54:01.04 ID:fxXPyGX0.net] >>966 え?… Cのほうが納得できない char[3]; char[1]に文字が入ってると思うんですけど? だってポインタではないんだから
986 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 10:59:59.51 ID:DiaxdW8Z.net] >>969 文字じゃなくて文字列 "a"は文字、'a'は文字列
987 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 11:00:21.69 ID:DiaxdW8Z.net] ごめん逆 "a"は文字列、'a'は文字
988 名前:デフォルトの名無しさん [2016/07/31(日) 11:02:36.94 ID:fxXPyGX0.net] >>970 あ文字列ならポインタってことになるけど ポインタの場合はスタックは1個では?? なんで3個あるんでしょう?それが謎
989 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 11:06:42.62 ID:nqVHC6AT.net] Cの話は他のスレで
990 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 11:07:17.06 ID:VGHB1MRw.net] >>972 { "abc" }なら文字列一個だけど{"a","b","c"}なら文字列3個でしょ
991 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 11:08:30.96 ID:DiaxdW8Z.net] >>972 スタックに"a"へのポインタ、"b"への"ポインタ、"c"へのポインタが詰まれている
992 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 11:09:22.00 ID:fxXPyGX0.net] 配列が出てきたから勝手にそれで文字列を実現するって解釈してしまったなぁ すいません
993 名前:デフォルトの名無しさん [2016/07/31(日) 11:09:59.85 ID:fxXPyGX0.net] >>974 なるほど文字列3つってことですね 勝手に文字列を実現するみたいな解釈してました "abc"ではないんですねすいません失礼しました
994 名前:デフォルトの名無しさん [2016/07/31(日) 11:26:30.84 ID:tdu9NojY.net] おはようございます。930です。今からコードを見直してみようと思います >> 953 ちなみにdb.Entry(student).State = EntityState.Unchanged;みたいなのしていますか? これをしないと片方の追加だけなのに、もう片方に新規で追加されていきます。DBcontextをまとめた処理が public DbSet<Subject> SubjectInfo { get; set; } public DbSet<Teacher> TeacherInfo { get; set; } public DbSet<Student> StudentInfo { get; set; } 追加時は下記です。 public Teacher Create( Teacher teacher ) { Teacher newTeacher; using( var db = new DbContext() ) { // 外部キーで設定している科目と関連付ける処理 User subject = ( from d in db.SubjectInfo where d.Id == Teacher.User.Id select d ).First(); db.Entry( subject ).State = EntityState.Unchanged; newTeacher = new Teacher { Name = teacher.Name, Subject = subject, studentLists = teacher.studentLists // これを入れるとMultiplicity constraint violated. // db.Entry(???).State = EntityState.Unchanged;でエラー }; if ( newTeacher.studentLists != null) { foreach ( Student student in newTeacher.studentLists ) { // db.studentInfo.Attach( student ); // db.Entry( student ).State = EntityState.Unchanged; } } // アクセスするところを紐づける GetTable( db ).Add( newTeacher ); db.SaveChanges(); } return newTeacher; }
995 名前:デフォルトの名無しさん [2016/07/31(日) 11:30:03.17 ID:tdu9NojY.net] 新しい作成される中間テーブルにデータが入ってなかった理由は、 newTeacherを作っているときに、studentLists = teacher.studentListsを入れてなかったからだとは思ったんですが、 そうすると今度は片方のテーブルに影響を与えない…って処理でエラーが出るように。 アドバイスを頂いたところは今から見直します
996 名前:デフォルトの名無しさん [2016/07/31(日) 11:41:40.57 ID:9Z6DmbVF.net] ハイ次w
997 名前:デフォルトの名無しさん [2016/07/31(日) 11:47:57.52 ID:tdu9NojY.net] 連レスですみません これって、講師と学生を単純に考えた場合、講師を先に入れると学生のデータはなく、学生を先に入れると講師のデータがない。 そのような状況になると思います。 その時に、中間テーブルには講師のデータはあるけども…!学生のデータがない!関連付けれない!となるのでしょうか。 そのため、DBに値が入る順序としては、講師のデータが入る→学生のデータが入る→中間テーブルに関連する値が入る こういう認識で良いのですかね >>947 やりたいこととしてはそんな感じです。 その際に、中間テーブルに値を入れたい…!って状況です >>975 一番包括するキーのクラスでAddを定義する感じでしょうか。 今コードを見てみたのですが、外部キーをそこで設定する必要がないのかなと思っています。(thisのとこ) 先に教えている学生を生成し追加して、講師に追加する…というところは参考にさせて頂きました。 そのおかげで、テーブルには入る様になりました! ただ、>>978 のようなエラーが出てきました…
998 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 11:57:52.20 ID:KfDsWSu1.net] >>981 次スレよろ。 で、0..n対0..nの関係なら、生徒を持ってない講師が居ても良くて、中間テーブルにその講師は登場しないはずだよ。
999 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 12:12:35.28 ID:nqVHC6AT.net] あれ?立てたのは別の人なのか?案内もないし ふらっと C#,C♯,C#(初心者用) Part123 [無断転載禁止]©2ch.net echo.2ch.net/test/read.cgi/tech/1469934170/ 取り合えず立てた人乙
1000 名前:デフォルトの名無しさん [2016/07/31(日) 12:16:36.38 ID:tdu9NojY.net] 別回線で立ててコーディングに夢中で案内忘れていました… >> 981 NULLを許容するかしないかって話ですよね 自分もそう思っているのですが… DB扱うのって本当に難しいですね…
1001 名前:デフォルトの名無しさん [2016/07/31(日) 12:21:48.88 ID:9Z6DmbVF.net] 取り合えず立てた人チーすw
1002 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 13:03:24.52 ID:4EU300F7.net] 俺も良くわかってないが双方向でリストを持っているときっていつそれぞれのを結びつけるんだ? それとも結びつけなくていいのか Aを追加するときにBは居ないし逆もまた然りって永遠ループが頭の中で続くわ
1003 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 13:35:00.89 ID:4EU300F7.net] 書かれていることやろうとしても中間テーブルみたいなのは無理にとおせばできるけど 無限増殖問題か値が入らない問題が起きるぞ なんで >>954 はできるんだ?コードが見てみたいんだが
1004 名前:デフォルトの名無しさん [2016/07/31(日) 13:39:55.24 ID:tdu9NojY.net] >>953 レスを返し忘れていました。 確かに、AはCに対して外部キー設定をしていて、同様の扱いをするのにAはBに対して外部キー設定をしていないので、 そこが怪しい気もします
1005 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 13:59:51.45 ID:BZqbbjGS.net] >>986 この辺参考にしたら? www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
1006 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 15:08:27.13 ID:SlcEPNYS.net] そもそも中間テーブルのクラス(エンティティ)は必要なのか? そしてその中間テーブルCに対して、A,Bそれぞれから外部キー制約が必要なのか? NOなら、中間テーブルの作成すらコードファーストで勝手にやらせるだけ YESなら、Aのエンティティが持つのはBじゃなくてCのエンティティ、Bも同様
1007 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 15:15:13.16 ID:7sIN5pY9.net] >>990 おっさんなんか勘違いしてないか C has A C has B んでもってA has B, B has A だからCは中間テーブルでないぞ ややこしくあるのはA Bだけでしょ Cは今回出てきてるけどただ持ってるだけで実際関係ないゾ
1008 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 15:42:51.77 ID:SlcEPNYS.net] >>991 もともとA,Bで多対多のリレーションって話だったはずなんだが なんか勘違いしてるってなら >C has A >C has B >んでもってA has B, B has A の条件でテーブル定義かエンティティクラスの定義書いてみてくれんかね
1009 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 15:59:25.30 ID:SlcEPNYS.net] 埋めるように雑談 EFって、to 0..Nのリレーションはできるけど to 1..N のリレーションは 相手方の1を強制(保障)する方法がない気がするんだが つまり 1..N:1..Nはコードファーストでは実現不可能なんじゃないかと思うんだが
1010 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 16:05:53.41 ID:7sIN5pY9.net] >>992 上にもあるけどこうじゃねぇの public class C { public int Id {get;set;} public List<A> a {get;set;} public List<B> b {get;set;} } public class A { public int Id {get;set;} public List<B> ListB {get;set;} public virtual C c {get;set;} public A(){ ListB = new List<B>();} } public class B { public int Id {get;set;} public List<A> ListA {get;set;} public virtual C c {get;set;} public B(){ ListA = new List<A>();} } static void main(){ C c = new C{Id=1} // できるやつ。でもCA、CBの関係はあるけどABの関係がないから値が入らない c.a.ListB.add(new B{Id=1, c=c}); c.b.ListA.add(new A{Id=1, c=c}); // できないやつ。逆も同様 c.a.ListB.add(new B{Id=1, c=c, ListB =???}); }
1011 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 16:11:54.97 ID:SlcEPNYS.net] >>994 AがCとListBと両方同時に持ってるのか? Aが直接持つB群と、Cを通じて持つB群と別のものなのか?
1012 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 16:22:22.34 ID:7sIN5pY9.net] >>995 同じなんじゃないの それを結びつけようと頑張ってるんだと思う 俺はそう捉えて悩んでる 科目一つに対して講師が複数居る 科目一つに対して生徒が複数居る そんな状況で、講師と生徒を結びつけたいのだと…あれ?ってことはこれ public class C { public int Id {get;set;} public A a {get;set;} public B b {get;set;} } public class A { public int Id {get;set;} public List<B> ListB {get;set;} public virtual C c {get;set;} public A(){ ListB = new List<B>();} } public class B { public int Id {get;set;} public List<A> ListA {get;set;} public virtual C c {get;set;} public B(){ ListA = new List<A>();} } static void main(){ List<C> c = new C(); c.Add(); } こんな感じにしたらシンプルなんじゃないのかこの問題
1013 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 16:28:58.96 ID:7sIN5pY9.net] 違うわ シンプルにできん たぶん科目に対して講師及び学生をリストで持ってるんだ そしてそれぞれ講師・学生が持つ要素が同じものを指し示してる そんでもってそれを科目の要素としてそれぞれに追加する時に 片方の要素が存在してないからどうすりゃええの?ってなってんだわきっと
1014 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 16:29:55.38 ID:SlcEPNYS.net] >>996 同じなら、AにCとListB両方は同時にいらない。DB的にはあってはいけない だから>>990 は CというエンティティがあればListBはいらない ListBがあれば、Cはいらない という内容のことを言ったつもりなんだが
1015 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 16:33:52.27 ID:SlcEPNYS.net] いつのまにか A,Bのリレーションとそのための中間テーブルCっていう話から 講師、学生、科目という三つの実体の話にすり替わってるな 元の要件整理しなおさんと話が進まん
1016 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 16:34:43.64 ID:5iBcOCRm.net] じゃあちょっと話を整理してみましょうか
1017 名前:デフォルトの名無しさん mailto:sage [2016/07/31(日) 16:37:40.65 ID:SlcEPNYS.net] これ以上続けるなら次スレで やりたいこととちゃんとしたエンティティの定義出して で、この話題はスレとともに一旦終了
1018 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。 life time: 21日 16時間 2分 51秒
1019 名前:1002 [Over 1000 Thread.net] 2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。 運営にご協力お願いいたします。 ─────────────────── 《プレミアム会員の主な特典》 ★ 2ちゃんねる専用ブラウザからの広告除去 ★ 2ちゃんねるの過去ログを取得 ★ 書き込み規制の緩和 ─────────────────── 会員登録には個人情報は一切必要ありません。 月300円から匿名でご購入いただけます。 ▼ プレミアム会員登録はこちら ▼ premium.2ch.net/ pink-chan-store.myshopify.com/
1020 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています