MVC3发布有一段时间了,一直没有时间来学习。
最近总算有点闲余时间了,该抓紧搞搞学习,否则就什么都不懂了。
到http://www.asp.net/MVC 网站上面有个示例叫《Music Store》,把它荡下来学习学习。先从数据库入手。
将该示例的数据库附加到数据库服务器上。通过PowerDesigner反向生成PhysicalDataModel,然后再生成为ConceptualDataModel。(本人喜欢使用概念模型来分析设计数据库。原来生成出来的是英文内容,为了理解方便,我将英文添加了中文注释。)生成后的效果图如下:
该项目中有6个实体,其中专辑实体是整个案例中比较核心的部分。其它五个实体都是与它有关系的:
1.艺术家出了哪些专辑("艺术家"1对多"专辑")
2.专辑属于哪个流派("流派"一对多"专辑")
3.购物车中有哪些专辑("专辑"一对多"购物车")
4.订单中具体详情如何("订单"一对多"订单详情")
5.专辑存在于哪个订单详情中。("专辑"一对多"订单详情")
物理模型如下图所示:
看完之后心存疑问:
1.购物车是否需要用这个Carts表来保存...(等看完代码后再回头看看是个怎么回事)
购物车中的"购物车编号"怎么得来的?是否与用户有关系?
我认为"专辑"与"订单"是有直接关系的,应该是多对多的映射关系.(一张专辑存在多个订单中,一个订单里面有多个专辑).多对多关系在生成物理模型的时候会自动创建一个中间表,这个中间表就是这两个实体通过多对多产生出来的主外键组成.由于该中间表只有主外键还不能很好的描述订单里面专辑的详细信息(数量、单价),所以在这个反向生成出来的关系图上面多了个中间实体对象"订单详情".如果在该图上直接描述"专辑"与"订单"两个实体之间的关系的话,则将来需要在生成出来的物理模型上面的中间表添加上两个字段(数量、单价).
多对多的映射关系图可以建成如下所示:
生成出来的物理模型如下所示:
上图中就可以明显看出该中间表就少了两个字段(数量、单价),所以要自己加上.
生成出来的SQL代码如下:
1: /*==============================================================*/
2: /* DBMS name: Microsoft SQL Server 2008 */
3: /* Created on: 2011/2/25 16:29:13 */
4: /*==============================================================*/
5:
6:
7: if exists (select 1
8: from sysindexes
9: where id = object_id('Albums')
10: and name = 'FK_Album_Genre_FK'
11: and indid > 0
12: and indid < 255)
13: drop index Albums.FK_Album_Genre_FK
14: go
15:
16: if exists (select 1
17: from sysindexes
18: where id = object_id('Albums')
19: and name = 'FK__Album__ArtistId__276EDEB3_FK'
20: and indid > 0
21: and indid < 255)
22: drop index Albums.FK__Album__ArtistId__276EDEB3_FK
23: go
24:
25: if exists (select 1
26: from sysobjects
27: where id = object_id('Albums')
28: and type = 'U')
29: drop table Albums
30: go
31:
32: if exists (select 1
33: from sysobjects
34: where id = object_id('Artists')
35: and type = 'U')
36: drop table Artists
37: go
38:
39: if exists (select 1
40: from sysindexes
41: where id = object_id('Carts')
42: and name = 'FK_Cart_Album_FK'
43: and indid > 0
44: and indid < 255)
45: drop index Carts.FK_Cart_Album_FK
46: go
47:
48: if exists (select 1
49: from sysobjects
50: where id = object_id('Carts')
51: and type = 'U')
52: drop table Carts
53: go
54:
55: if exists (select 1
56: from sysobjects
57: where id = object_id('Genres')
58: and type = 'U')
59: drop table Genres
60: go
61:
62: if exists (select 1
63: from sysindexes
64: where id = object_id('OrderDetails')
65: and name = 'FK_OrderDetail_Album_FK'
66: and indid > 0
67: and indid < 255)
68: drop index OrderDetails.FK_OrderDetail_Album_FK
69: go
70:
71: if exists (select 1
72: from sysindexes
73: where id = object_id('OrderDetails')
74: and name = 'FK__InvoiceLi__Invoi__2F10007B_FK'
75: and indid > 0
76: and indid < 255)
77: drop index OrderDetails.FK__InvoiceLi__Invoi__2F10007B_FK
78: go
79:
80: if exists (select 1
81: from sysobjects
82: where id = object_id('OrderDetails')
83: and type = 'U')
84: drop table OrderDetails
85: go
86:
87: if exists (select 1
88: from sysobjects
89: where id = object_id('Orders')
90: and type = 'U')
91: drop table Orders
92: go
93:
94: /*==============================================================*/
95: /* Table: Albums */
96: /*==============================================================*/
97: create table Albums (
98: AlbumId numeric identity(1, 1),
99: ArtistId numeric not null,
100: GenreId numeric not null,
101: Title nvarchar(160) collate SQL_Latin1_General_CP1_CI_AS not null,
102: Price numeric(10,2) not null,
103: AlbumArtUrl nvarchar(1024) collate SQL_Latin1_General_CP1_CI_AS null constraint DF_Album_AlbumArtUrl default N'/Content/Images/placeholder.gif',
104: constraint PK_ALBUMS primary key nonclustered (AlbumId)
105: )
106: go
107:
108: declare @CurrentUser sysname
109: select @CurrentUser = user_name()
110: execute sp_addextendedproperty 'MS_Description',
111: '专辑编号',
112: 'user', @CurrentUser, 'table', 'Albums', 'column', 'AlbumId'
113: go
114:
115: declare @CurrentUser sysname
116: select @CurrentUser = user_name()
117: execute sp_addextendedproperty 'MS_Description',
118: '艺术家编号',
119: 'user', @CurrentUser, 'table', 'Albums', 'column', 'ArtistId'
120: go
121:
122: declare @CurrentUser sysname
123: select @CurrentUser = user_name()
124: execute sp_addextendedproperty 'MS_Description',
125: '流派编号',
126: 'user', @CurrentUser, 'table', 'Albums', 'column', 'GenreId'
127: go
128:
129: declare @CurrentUser sysname
130: select @CurrentUser = user_name()
131: execute sp_addextendedproperty 'MS_Description',
132: '标题',
133: 'user', @CurrentUser, 'table', 'Albums', 'column', 'Title'
134: go
135:
136: declare @CurrentUser sysname
137: select @CurrentUser = user_name()
138: execute sp_addextendedproperty 'MS_Description',
139: '价格',
140: 'user', @CurrentUser, 'table', 'Albums', 'column', 'Price'
141: go
142:
143: declare @CurrentUser sysname
144: select @CurrentUser = user_name()
145: execute sp_addextendedproperty 'MS_Description',
146: '专辑图片路径',
147: 'user', @CurrentUser, 'table', 'Albums', 'column', 'AlbumArtUrl'
148: go
149:
150: /*==============================================================*/
151: /* Index: FK__Album__ArtistId__276EDEB3_FK */
152: /*==============================================================*/
153: create index FK__Album__ArtistId__276EDEB3_FK on Albums (
154: ArtistId ASC
155: )
156: go
157:
158: /*==============================================================*/
159: /* Index: FK_Album_Genre_FK */
160: /*==============================================================*/
161: create index FK_Album_Genre_FK on Albums (
162: GenreId ASC
163: )
164: go
165:
166: /*==============================================================*/
167: /* Table: Artists */
168: /*==============================================================*/
169: create table Artists (
170: ArtistId numeric identity(1, 1),
171: Name nvarchar(120) collate SQL_Latin1_General_CP1_CI_AS null,
172: constraint PK_ARTISTS primary key nonclustered (ArtistId)
173: )
174: go
175:
176: declare @CurrentUser sysname
177: select @CurrentUser = user_name()
178: execute sp_addextendedproperty 'MS_Description',
179: '艺术家编号',
180: 'user', @CurrentUser, 'table', 'Artists', 'column', 'ArtistId'
181: go
182:
183: declare @CurrentUser sysname
184: select @CurrentUser = user_name()
185: execute sp_addextendedproperty 'MS_Description',
186: '艺术家名称',
187: 'user', @CurrentUser, 'table', 'Artists', 'column', 'Name'
188: go
189:
190: /*==============================================================*/
191: /* Table: Carts */
192: /*==============================================================*/
193: create table Carts (
194: RecordId numeric identity(1, 1),
195: AlbumId numeric not null,
196: CartId varchar(50) collate SQL_Latin1_General_CP1_CI_AS not null,
197: Count int not null,
198: DateCreated datetime not null,
199: constraint PK_CARTS primary key nonclustered (RecordId)
200: )
201: go
202:
203: declare @CurrentUser sysname
204: select @CurrentUser = user_name()
205: execute sp_addextendedproperty 'MS_Description',
206: '购物车实体',
207: 'user', @CurrentUser, 'table', 'Carts'
208: go
209:
210: declare @CurrentUser sysname
211: select @CurrentUser = user_name()
212: execute sp_addextendedproperty 'MS_Description',
213: '记录编号',
214: 'user', @CurrentUser, 'table', 'Carts', 'column', 'RecordId'
215: go
216:
217: declare @CurrentUser sysname
218: select @CurrentUser = user_name()
219: execute sp_addextendedproperty 'MS_Description',
220: '专辑编号',
221: 'user', @CurrentUser, 'table', 'Carts', 'column', 'AlbumId'
222: go
223:
224: declare @CurrentUser sysname
225: select @CurrentUser = user_name()
226: execute sp_addextendedproperty 'MS_Description',
227: '购物车编号',
228: 'user', @CurrentUser, 'table', 'Carts', 'column', 'CartId'
229: go
230:
231: declare @CurrentUser sysname
232: select @CurrentUser = user_name()
233: execute sp_addextendedproperty 'MS_Description',
234: '数量',
235: 'user', @CurrentUser, 'table', 'Carts', 'column', 'Count'
236: go
237:
238: declare @CurrentUser sysname
239: select @CurrentUser = user_name()
240: execute sp_addextendedproperty 'MS_Description',
241: '创建时间',
242: 'user', @CurrentUser, 'table', 'Carts', 'column', 'DateCreated'
243: go
244:
245: /*==============================================================*/
246: /* Index: FK_Cart_Album_FK */
247: /*==============================================================*/
248: create index FK_Cart_Album_FK on Carts (
249: AlbumId ASC
250: )
251: go
252:
253: /*==============================================================*/
254: /* Table: Genres */
255: /*==============================================================*/
256: create table Genres (
257: GenreId numeric identity(1, 1),
258: Name nvarchar(120) collate SQL_Latin1_General_CP1_CI_AS null,
259: Description nvarchar(4000) collate SQL_Latin1_General_CP1_CI_AS null,
260: constraint PK_GENRES primary key nonclustered (GenreId)
261: )
262: go
263:
264: declare @CurrentUser sysname
265: select @CurrentUser = user_name()
266: execute sp_addextendedproperty 'MS_Description',
267: '流派编号',
268: 'user', @CurrentUser, 'table', 'Genres', 'column', 'GenreId'
269: go
270:
271: declare @CurrentUser sysname
272: select @CurrentUser = user_name()
273: execute sp_addextendedproperty 'MS_Description',
274: '流派名称',
275: 'user', @CurrentUser, 'table', 'Genres', 'column', 'Name'
276: go
277:
278: declare @CurrentUser sysname
279: select @CurrentUser = user_name()
280: execute sp_addextendedproperty 'MS_Description',
281: '流派描述',
282: 'user', @CurrentUser, 'table', 'Genres', 'column', 'Description'
283: go
284:
285: /*==============================================================*/
286: /* Table: OrderDetails */
287: /*==============================================================*/
288: create table OrderDetails (
289: OrderDetailId numeric identity(1, 1),
290: AlbumId numeric not null,
291: OrderId numeric not null,
292: Quantity int not null,
293: UnitPrice numeric(10,2) not null,
294: constraint PK_ORDERDETAILS primary key nonclustered (OrderDetailId)
295: )
296: go
297:
298: declare @CurrentUser sysname
299: select @CurrentUser = user_name()
300: execute sp_addextendedproperty 'MS_Description',
301: '订单详情编号',
302: 'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'OrderDetailId'
303: go
304:
305: declare @CurrentUser sysname
306: select @CurrentUser = user_name()
307: execute sp_addextendedproperty 'MS_Description',
308: '专辑编号',
309: 'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'AlbumId'
310: go
311:
312: declare @CurrentUser sysname
313: select @CurrentUser = user_name()
314: execute sp_addextendedproperty 'MS_Description',
315: '订单编号',
316: 'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'OrderId'
317: go
318:
319: declare @CurrentUser sysname
320: select @CurrentUser = user_name()
321: execute sp_addextendedproperty 'MS_Description',
322: '数量',
323: 'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'Quantity'
324: go
325:
326: declare @CurrentUser sysname
327: select @CurrentUser = user_name()
328: execute sp_addextendedproperty 'MS_Description',
329: '单价',
330: 'user', @CurrentUser, 'table', 'OrderDetails', 'column', 'UnitPrice'
331: go
332:
333: /*==============================================================*/
334: /* Index: FK__InvoiceLi__Invoi__2F10007B_FK */
335: /*==============================================================*/
336: create index FK__InvoiceLi__Invoi__2F10007B_FK on OrderDetails (
337: OrderId ASC
338: )
339: go
340:
341: /*==============================================================*/
342: /* Index: FK_OrderDetail_Album_FK */
343: /*==============================================================*/
344: create index FK_OrderDetail_Album_FK on OrderDetails (
345: AlbumId ASC
346: )
347: go
348:
349: /*==============================================================*/
350: /* Table: Orders */
351: /*==============================================================*/
352: create table Orders (
353: OrderId numeric identity(1, 1),
354: OrderDate datetime not null,
355: Username nvarchar(256) collate SQL_Latin1_General_CP1_CI_AS null,
356: FirstName nvarchar(160) collate SQL_Latin1_General_CP1_CI_AS null,
357: LastName nvarchar(160) collate SQL_Latin1_General_CP1_CI_AS null,
358: Address nvarchar(70) collate SQL_Latin1_General_CP1_CI_AS null,
359: City nvarchar(40) collate SQL_Latin1_General_CP1_CI_AS null,
360: State nvarchar(40) collate SQL_Latin1_General_CP1_CI_AS null,
361: PostalCode nvarchar(10) collate SQL_Latin1_General_CP1_CI_AS null,
362: Country nvarchar(40) collate SQL_Latin1_General_CP1_CI_AS null,
363: Phone nvarchar(24) collate SQL_Latin1_General_CP1_CI_AS null,
364: Email nvarchar(160) collate SQL_Latin1_General_CP1_CI_AS null,
365: Total numeric(10,2) not null,
366: constraint PK_ORDERS primary key nonclustered (OrderId)
367: )
368: go
369:
370: declare @CurrentUser sysname
371: select @CurrentUser = user_name()
372: execute sp_addextendedproperty 'MS_Description',
373: '订单',
374: 'user', @CurrentUser, 'table', 'Orders'
375: go
376:
377: declare @CurrentUser sysname
378: select @CurrentUser = user_name()
379: execute sp_addextendedproperty 'MS_Description',
380: '订单编号',
381: 'user', @CurrentUser, 'table', 'Orders', 'column', 'OrderId'
382: go
383:
384: declare @CurrentUser sysname
385: select @CurrentUser = user_name()
386: execute sp_addextendedproperty 'MS_Description',
387: '订单日期',
388: 'user', @CurrentUser, 'table', 'Orders', 'column', 'OrderDate'
389: go
390:
391: declare @CurrentUser sysname
392: select @CurrentUser = user_name()
393: execute sp_addextendedproperty 'MS_Description',
394: '用户名',
395: 'user', @CurrentUser, 'table', 'Orders', 'column', 'Username'
396: go
397:
398: declare @CurrentUser sysname
399: select @CurrentUser = user_name()
400: execute sp_addextendedproperty 'MS_Description',
401: '名字',
402: 'user', @CurrentUser, 'table', 'Orders', 'column', 'FirstName'
403: go
404:
405: declare @CurrentUser sysname
406: select @CurrentUser = user_name()
407: execute sp_addextendedproperty 'MS_Description',
408: '姓氏',
409: 'user', @CurrentUser, 'table', 'Orders', 'column', 'LastName'
410: go
411:
412: declare @CurrentUser sysname
413: select @CurrentUser = user_name()
414: execute sp_addextendedproperty 'MS_Description',
415: '地址',
416: 'user', @CurrentUser, 'table', 'Orders', 'column', 'Address'
417: go
418:
419: declare @CurrentUser sysname
420: select @CurrentUser = user_name()
421: execute sp_addextendedproperty 'MS_Description',
422: '城市',
423: 'user', @CurrentUser, 'table', 'Orders', 'column', 'City'
424: go
425:
426: declare @CurrentUser sysname
427: select @CurrentUser = user_name()
428: execute sp_addextendedproperty 'MS_Description',
429: '省份/州',
430: 'user', @CurrentUser, 'table', 'Orders', 'column', 'State'
431: go
432:
433: declare @CurrentUser sysname
434: select @CurrentUser = user_name()
435: execute sp_addextendedproperty 'MS_Description',
436: '邮政编码',
437: 'user', @CurrentUser, 'table', 'Orders', 'column', 'PostalCode'
438: go
439:
440: declare @CurrentUser sysname
441: select @CurrentUser = user_name()
442: execute sp_addextendedproperty 'MS_Description',
443: '国家',
444: 'user', @CurrentUser, 'table', 'Orders', 'column', 'Country'
445: go
446:
447: declare @CurrentUser sysname
448: select @CurrentUser = user_name()
449: execute sp_addextendedproperty 'MS_Description',
450: '联系电话',
451: 'user', @CurrentUser, 'table', 'Orders', 'column', 'Phone'
452: go
453:
454: declare @CurrentUser sysname
455: select @CurrentUser = user_name()
456: execute sp_addextendedproperty 'MS_Description',
457: 'Email/电子邮件',
458: 'user', @CurrentUser, 'table', 'Orders', 'column', 'Email'
459: go
460:
461: declare @CurrentUser sysname
462: select @CurrentUser = user_name()
463: execute sp_addextendedproperty 'MS_Description',
464: '总计',
465: 'user', @CurrentUser, 'table', 'Orders', 'column', 'Total'
466: go
467: