質問編集履歴

1

本文中に質問を追記

2019/08/03 07:22

投稿

tappuri
tappuri

スコア7

test CHANGED
File without changes
test CHANGED
@@ -235,3 +235,113 @@
235
235
  Microsoft Visual Studio Community 2019
236
236
 
237
237
  Entity Framework 6.2.0
238
+
239
+
240
+
241
+
242
+
243
+ # 8/3 16:10 追記
244
+
245
+ SurferOnWwwさんからご回答頂いた内容の通り、SelectedDataクラスを追加してBtnSelect_Clickの内容を修正したところ正常にDataGridへ値を読みだせました。
246
+
247
+ ```C#
248
+
249
+ public class SelectedData
250
+
251
+ {
252
+
253
+ public int ProductID { get; set; }
254
+
255
+ public string Name { get; set; }
256
+
257
+ public string Maker { set; get; }
258
+
259
+ public string CategoryName { set; get; }
260
+
261
+ }
262
+
263
+ ```
264
+
265
+ ```C#
266
+
267
+ private void BtnSelect_Click(object sender, RoutedEventArgs e)
268
+
269
+ {
270
+
271
+ using (var context = new StockContext())
272
+
273
+ {
274
+
275
+ var query = from p in context.Products.Include(a => a.Category)
276
+
277
+ select new SelectedData
278
+
279
+ {
280
+
281
+ ProductID = p.ProductID,
282
+
283
+ Name = p.Name,
284
+
285
+ Maker = p.Maker,
286
+
287
+ CategoryName = p.Category.CategoryName
288
+
289
+ };
290
+
291
+
292
+
293
+ dgv.ItemsSource = query.ToArray();
294
+
295
+ }
296
+
297
+ }
298
+
299
+ ```
300
+
301
+
302
+
303
+ また、Entity Framework 6 Power Tools Community Editionによるグラフ化、DB生成のSQL文の確認ができました。
304
+
305
+ ![イメージ説明](e5816a457487499871d30add1256d653.png)
306
+
307
+ ```SQL
308
+
309
+ create table [dbo].[Products] (
310
+
311
+ [ProductID] [int] not null identity,
312
+
313
+ [Name] [nvarchar](max) null,
314
+
315
+ [Maker] [nvarchar](max) null,
316
+
317
+ [Category_CategoryID] [int] null,
318
+
319
+ primary key ([ProductID])
320
+
321
+ );
322
+
323
+ create table [dbo].[ProductCategories] (
324
+
325
+ [CategoryID] [int] not null identity,
326
+
327
+ [CategoryName] [nvarchar](max) null,
328
+
329
+ primary key ([CategoryID])
330
+
331
+ );
332
+
333
+ alter table [dbo].[Products] add constraint [Product_Category] foreign key ([Category_CategoryID]) references [dbo].[ProductCategories]([CategoryID]);
334
+
335
+ ```
336
+
337
+ いつもSSMSのデザイナからテーブルへの変更を加えていたのでER図?やSQL文を見るのはほぼ初めてですが、私が見たところ想定通りのDBになっているように思います。
338
+
339
+
340
+
341
+ しかしまだ気になる部分があります。
342
+
343
+ 1つ目はEntity Framework, コードファーストというかっこよさげなものを使っていながらInsertとSelectでクラスを使い分けないといけない事です。これは、public ProductCategory Category { get; set; }のような書き方をやめて[ForeignKey()]などで代用して設計しなおすことで解消できるのでしょうか?(そもそもデータベースファーストを使用しろという話なのでしょうか)
344
+
345
+
346
+
347
+ 2つ目はInsertしたときの挙動です。先程、想定通りのDBになっていると言ったもののProductCategiesテーブルをSSMSから確認するとCategoryNameに重複した値が書き込まれてしまっています。Entity Frameworkが勝手に判断してくれるということは無く、SQL同様に親テーブルにデータを入れておき、子テーブルに書き込むときに親テーブルのIDを使用するしかないでしょうか?