Математика | ||||
Pro ASP.NET for SQL Server High Performance Data Access for Web Developers - Brennan Stehling str394 | ||||
Pro ASP.NET for SQL Server High Performance Data Access for Web Developers - Brennan Stehling str394
Contents at a Glance About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii ЃЎCHAPTER 1 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 ЃЎCHAPTER 2 Data Model Choices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 ЃЎCHAPTER 3 Database Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 ЃЎCHAPTER 4 Databound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 ЃЎCHAPTER 5 SQL Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 ЃЎCHAPTER 6 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 ЃЎCHAPTER 7 Manual Data Access Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 ЃЎCHAPTER 8 Generated Data Access Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 ЃЎCHAPTER 9 Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 ЃЎCHAPTER 10 A Sample Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 ЃЎAPPENDIX Photo Album . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 ЃЎINDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 iii Contents About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii ЃЎCHAPTER 1 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Preparing Your Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Project Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Common Folders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Datasource Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Code and Database Separation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Managing Provider Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Using the Command Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Mixing and Matching Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Configuring Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Membership Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Roles Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Profile Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Creating Users and Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Securing the Admin Section . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Creating the Admin User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 ЃЎCHAPTER 2 Data Model Choices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 The Data Access Application Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Data Access Code Snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Sample Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Trivial Data Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Nontrivial Data Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Typed DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Nontyped DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 DataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 v DataObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 WhatЃfs the Downside? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 ЃЎCHAPTER 3 Database Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Using Database Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 SQL Server Management Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Managing Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Managing Indexes and Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Performance Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Stability Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Unit Tests for Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Continuous Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 ЃЎCHAPTER 4 Databound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Editing and Validating Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Binding Input Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Binding Input Parameters with a Control . . . . . . . . . . . . . . . . . . . . . . 81 Binding Input Parameters Programmatically . . . . . . . . . . . . . . . . . . . 82 Binding a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Embedding Databound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 ViewState and Databinding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Session and ViewState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Disabling ViewState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 ControlState vs. ViewState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Creating a Databound Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Getting the Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Getting the Total Rows Count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Wiring the Pager Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Creating PersonRow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Persisting ViewState Manually . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Working Without ViewState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Walking the Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 vi ЃЎCONTENTS ЃЎCHAPTER 5 SQL Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 The SqlMembershipProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Using XML Implementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Setting the Database Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Creating a Password Policy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 The SqlRoleProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Controlling Access by Role . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Controlling Behavior by Role . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 The SqlProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Why Anonymous Profiles? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Configuring Anonymous Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Managing Anonymous Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Anonymous and Authenticated Profile Differences . . . . . . . . . . . . . 121 Migrating from Anonymous to Authenticated . . . . . . . . . . . . . . . . . 121 Creating a User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Dynamic Profiles and Profiles as BLOBs . . . . . . . . . . . . . . . . . . . . . . 124 Using the Provider-Powered ASP.NET Controls . . . . . . . . . . . . . . . . . . . . . 126 Building a SQL Photo Album Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Provider Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Configuration Section Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Provider Collection Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Abstract Provider Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 The Provider Implementation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Provider Service Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 The Finished Product . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Building a SQL SiteMap Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 SiteMap Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Implementing SiteMapProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 ЃЎCHAPTER 6 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Alternatives to Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Application State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 ViewState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Current Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Caching Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Data Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 ЃЎCONTENTS vii Invalidating Cached Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Absolute Expiration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Sliding Expiration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Cache Dependency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Manual Removal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 SQL Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Using the SqlDependency and SqlCacheDependency . . . . . . . . . . 165 Polling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Query Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 Troubleshooting Query Notifications . . . . . . . . . . . . . . . . . . . . . . . . . 176 Problems with Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Performance Strategies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Data Warehousing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Lazy Loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 ЃЎCHAPTER 7 Manual Data Access Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Using DataSets, Inline SQL, and Stored Procedures . . . . . . . . . . . . . . . . . 191 DataSets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Inline SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 Using DataObjects and the ObjectDataSource . . . . . . . . . . . . . . . . . . . . . 199 Design Contract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Data Contract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Testing the Design and Data Contracts . . . . . . . . . . . . . . . . . . . . . . . 203 Building the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Creating the Database Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Consolidating the Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 Managing Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 Created and Modified . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 What About Nulls? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Using Database Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 The Data Access Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 Building the Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Connecting the Data Access Layer . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Creating User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 Creating the Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 viii ЃЎCONTENTS ЃЎCHAPTER 8 Generated Data Access Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Code Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Build Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 CodeDom Namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Templating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 SubSonic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 SubSonic Templating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Partial Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Query Tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Scaffolding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 Blinq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 ЃЎCHAPTER 9 Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Automation with MSBuild . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Deploying the Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Website Deployment Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Automating Configuration Changes . . . . . . . . . . . . . . . . . . . . . . . . . . 262 PostBuild Deployments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 Deploying the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 Generating Change Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Automating Database Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Custom Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 ЃЎCHAPTER 10 A Sample Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 Understanding Performance and Scalability . . . . . . . . . . . . . . . . . . . . . . . 289 Concurrent Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 Bottlenecks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Traffic Spikes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Distributing Traffic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 Distributing Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 Distributing Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Distributing the Back End . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 Planning for Scalability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 The Sample Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 Creating the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 Get, Save, and Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 ЃЎCONTENTS ix Creating Data Access Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 EventProvider Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 Revised DomainObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 Managing Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 Using Locations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 Custom Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Configuration Grouping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 Declaring the Custom Configuration . . . . . . . . . . . . . . . . . . . . . . . . . 317 Configuring the Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 Creating New Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 Implementing a LINQ Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321 Implementing a WCF Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 WCF Service Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Hosting the Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 Defining the DataContracts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Configuring the Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 Using the Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 ЃЎAPPENDIX Photo Album . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 Photo Album Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 Table Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 Constraints Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 Stored Procedure Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 Website Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 SQL SiteMap Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385 Table Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 Stored Procedure Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 Цена: 200руб. |
||||