[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 11/03 02:41 / Filesize : 281 KB / Number-of Response : 1021
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

ふらっと C#,C♯,C#(初心者用) Part122



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/

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 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<281KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef