Bladeren bron

创建本地数据库

master
QYYEE 5 jaren geleden
bovenliggende
commit
1d3c6c5f4c

+ 37
- 0
实践/后端/C#基础/27.C#中反射.md Bestand weergeven

@@ -0,0 +1,37 @@
1
+> System.Type类
2
+- 获取指向任何给定类型的Type引用有3种常用方式:
3
+    - 使用C#的typeof运算符
4
+    - 使用GetType()方法,所有类都会从System.Object继承这个方法。
5
+     ```
6
+     double d=10;
7
+     Type t= d.GetType();
8
+     ```
9
+    - 还可以调用Type类的静态方法GetType():
10
+     ```
11
+     Type t=Type.GetType("System.Double");
12
+     ```
13
+
14
+- Type 是许多反射功能的入口。它实现许多方法和属性,这里不可能列出所有的方法和属性。可用的属性都是只读的,可以使用Type确定数据的类型,但不能使用它修改类型
15
+
16
+
17
+>Assembly 类
18
+- Assembly类在System.Reflection 名称空间定义,它允许访问给定程序集的元数据,它也包含可以加载和执行程序集的方法。与Type类一样,Assemble类包含非常多的方法和属性。
19
+- Assembly类的一个功能是它可以获得在相应程序集中定义的所有类型的详细信息,只要调用Assembly.GetTypes()方法,它就可以返回一个包含所有类型的详细信息的System.Type引用数组。
20
+```
21
+Type[] types =theAssembly.GetTypes();
22
+
23
+foreach(Type definedType in types)
24
+{
25
+    DoSomethingWith(definedType);
26
+}
27
+```
28
+- 获取自定义特性的详细信息
29
+   - 用于查找在程序集或类型中定义了什么自定义特性的方法取决于与该特性相关的对象类型。如果要确定程序集从整体上关联了什么自定义特性,就需要调用Attribute类的一个静态方法GetCustomAttributes(),给它传递程序集的引用
30
+    ```
31
+    Attribute[] definedAttributes=Attribute.GetCustomAttributes(assembly1);
32
+    ```
33
+
34
+
35
+> dynamic 类型
36
+- dynamic类型允许编写忽略编译期间的类型检查的代码。编译器假定,给dynamic类型的对象定义的任何操作都是有效的。如果该操作无效,则在代码运行之前不会检测该错误。
37
+- 对于dynamic类型有两个限制。动态对象不支持扩展方法,匿名函数也不能用作动态方法调用的参数,因此LINQ不能用于动态对象。大多数LINQ调用都是扩展方法,而lambda表达式用作这些扩展方法的参数。

+ 58
- 2
实践/后端/C#基础/7.Linq.md Bestand weergeven

@@ -125,7 +125,63 @@ var countries=Formulal.GetChampions().GroupBy(r=>r.Country).Select(g=>new{Group=
125 125
              Name=r1.FirstName + "" +r1.LastName
126 126
          }
127 127
          join t in
128
-         from t1 in Formulal.GetContructorChampios
128
+         from t1 in Formulal.GetContructorChampios()
129
+           from yt in t1.Years select new
130
+           {
131
+               Year=yt,
132
+               Name=t1.Name
133
+           }
134
+           on r.Year equals t.Year
135
+           orderby new
136
+           {
137
+               Year=r.Year,
138
+               Racer=r.Name,
139
+               Team=t.Name
140
+           }).Take(10);
129 141
 
130 142
      }
131
-     ```
143
+     ```
144
+
145
+> 左外连接
146
+- 左外连接用join子句和DefaultIfEmpty方法定义。
147
+```
148
+var racersAndTeams=
149
+(from r in racers 
150
+join t in teams on r.Year equals t.Year into rt from t in rt.DefaultIfEmpty() orderby r.Year select new
151
+{
152
+    Year=r.Year,
153
+    Champion=r.Name,
154
+    Constructor=t==null?"no constructor championship":t.Name
155
+}).Take(10);
156
+```
157
+
158
+> 组连接
159
+
160
+- 左外连接使用了组连接和into子句。它有一部分语法与组连接相同,只不过组连接不使用DefaultIfEmpty方法。
161
+- 使用组连接时,可以连接两个独立的序列,对于其中一个序列中的某个元素,另一个序列中在对应的一个项列表。
162
+
163
+> 集合操作
164
+- 扩展方法Distinct(),Union(),Intersect(),Except()都是集合操作。
165
+- 集合操作通过调用实体类的GetHashCode()和Equals()方法来比较对象。对于自定义比较,还可以传递一个实现了IEqualityComparer<T>接口的对象。
166
+
167
+
168
+> 合并
169
+- Zip()方法允许用一个谓词函数把两个相关的序列合并为一个。
170
+```
171
+var racerNames=from r in Formulal.GetChampions() where r.Country=="Italy" orderby r.Wins descending select new
172
+{
173
+    Name=r.FiretName+""+r.LastName
174
+};
175
+var racerNamesAndStarts=from r in Formulal.GetChampions() where r.Country=="Italy" orderby r.Wins descending select new
176
+{
177
+    LastName=r.LastName,
178
+    Starts=r.Starts
179
+};
180
+
181
+var races=racerName.Zip(racerNamesAndStarts,
182
+(first,second)=>first.Name+",starts:"+second.Starts)
183
+foreach(var r in racers)
184
+{
185
+    WriteLine(r);
186
+}
187
+```

+ 161
- 0
实践/后端/项目/18.创建本地数据库迁移.md Bestand weergeven

@@ -0,0 +1,161 @@
1
+> 添加数据模型类
2
+- 模型类,在Model中添加。例如Movie类
3
+```
4
+using System;
5
+using System.ComponentModel.DataAnnotations;
6
+
7
+namespace MvcMovie.Models
8
+{
9
+    public class Movie
10
+    {
11
+        public int Id { get; set; }
12
+        public string Title { get; set; }
13
+
14
+        [DataType(DataType.Date)]
15
+        public DateTime ReleaseDate { get; set; }
16
+        public string Genre { get; set; }
17
+        public decimal Price { get; set; }
18
+    }
19
+}
20
+```
21
+> 脚手架电影模型
22
+- 电影模型是搭建的。也就是说,脚手架工具为电影模型生成用于创建,读取,更新和删除(CRUD)操作的页面。
23
+- 在Solution Explorer中,右键单击Controllers文件夹> Add> New Scaffolded Item
24
+- 在Add Scaffold对话框中,使用Entity Framework> Add选择带视图的MVC Controller。
25
+- 完成添加控制器对话框:
26
+   - 型号类: 电影(MvcMovie.Models)
27
+   - 数据上下文类:选择+图标并添加默认的MvcMovie.Models.MvcMovieContext
28
+
29
+
30
+> 初始迁移数据库
31
+
32
+- 添加初始迁移
33
+    - 从Tools菜单中,选择NuGet Package Manager > Package Manager Console(PMC)。
34
+    - 在PMC中,输入以下命令:Add-Migration Initial  /   Update-Database
35
+
36
+
37
+> 在.net core 中使用数据库
38
+- 该MvcMovieContext对象处理连接到数据库和将Movie对象映射到数据库记录的任务。数据库上下文在Startup.cs文件的方法中使用Dependency Injection容器注册:ConfigureServices
39
+```
40
+public void ConfigureServices(IServiceCollection services)
41
+{
42
+    services.Configure<CookiePolicyOptions>(options =>
43
+    {
44
+        // This lambda determines whether user consent for non-essential cookies 
45
+        // is needed for a given request.
46
+        options.CheckConsentNeeded = context => true;
47
+        options.MinimumSameSitePolicy = SameSiteMode.None;
48
+    });
49
+
50
+
51
+    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
52
+
53
+    services.AddDbContext<MvcMovieContext>(options =>
54
+         options.UseSqlServer(Configuration.GetConnectionString("MvcMovieContext")));
55
+}
56
+```
57
+
58
+- ASP.NET核心配置系统读取ConnectionString。对于本地开发,它从appsettings.json文件获取连接字符串:
59
+```
60
+"ConnectionStrings": {
61
+  "MvcMovieContext": "Server=(localdb)\\mssqllocaldb;Database=MvcMovieContext-2;Trusted_Connection=True;MultipleActiveResultSets=true"
62
+}
63
+```
64
+
65
+
66
+
67
+> 种子数据库
68
+- 创建一个SeedData在Models文件夹中命名的新类
69
+```
70
+using Microsoft.EntityFrameworkCore;
71
+using Microsoft.Extensions.DependencyInjection;
72
+using System;
73
+using System.Linq;
74
+
75
+namespace MvcMovie.Models
76
+{
77
+    public static class SeedData
78
+    {
79
+        public static void Initialize(IServiceProvider serviceProvider)
80
+        {
81
+            using (var context = new MvcMovieContext(
82
+                serviceProvider.GetRequiredService<
83
+                    DbContextOptions<MvcMovieContext>>()))
84
+            {
85
+                // Look for any movies.
86
+                if (context.Movie.Any())
87
+                {
88
+                    return;   // DB has been seeded
89
+                }
90
+
91
+                context.Movie.AddRange(
92
+                    new Movie
93
+                    {
94
+                        Title = "When Harry Met Sally",
95
+                        ReleaseDate = DateTime.Parse("1989-2-12"),
96
+                        Genre = "Romantic Comedy",
97
+                        Price = 7.99M
98
+                    },
99
+
100
+                    new Movie
101
+                    {
102
+                        Title = "Ghostbusters ",
103
+                        ReleaseDate = DateTime.Parse("1984-3-13"),
104
+                        Genre = "Comedy",
105
+                        Price = 8.99M
106
+                    },
107
+
108
+                    new Movie
109
+                    {
110
+                        Title = "Ghostbusters 2",
111
+                        ReleaseDate = DateTime.Parse("1986-2-23"),
112
+                        Genre = "Comedy",
113
+                        Price = 9.99M
114
+                    },
115
+
116
+                    new Movie
117
+                    {
118
+                        Title = "Rio Bravo",
119
+                        ReleaseDate = DateTime.Parse("1959-4-15"),
120
+                        Genre = "Western",
121
+                        Price = 3.99M
122
+                    }
123
+                );
124
+                context.SaveChanges();
125
+            }
126
+        }
127
+    }
128
+}
129
+```
130
+
131
+
132
+> 向模型中添加一个新字段
133
+- 将Rating属性添加到Models / Movie.cs:
134
+```
135
+public class Movie
136
+{
137
+    public int Id { get; set; }
138
+    public string Title { get; set; }
139
+
140
+    [Display(Name = "Release Date")]
141
+    [DataType(DataType.Date)]
142
+    public DateTime ReleaseDate { get; set; }
143
+    public string Genre { get; set; }
144
+
145
+    [Column(TypeName = "decimal(18, 2)")]
146
+    public decimal Price { get; set; }
147
+    public string Rating { get; set; }
148
+}
149
+```
150
+- 因为您已向类添加了新字段,所以Movie需要更新绑定白名单,以便包含此新属性。在MoviesController.cs中,更新[Bind]for Create和Editaction方法的Rating属性以包含属性:
151
+```
152
+[Bind("Id,Title,ReleaseDate,Genre,Price,Rating")]
153
+```
154
+- 更新视图模板,以便Rating在浏览器视图中显示,创建和编辑新属性。
155
+
156
+编辑/Views/Movies/Index.cshtml文件并添加一个Rating字段:
157
+- 使用字段更新/Views/Movies/Create.cshtmlRating。
158
+- 更新SeedData类,以便为新列提供值。示例更改如下所示,但您需要对每个更改进行此更改new Movie。
159
+
160
+- 在PMC中,输入以下命令:Add-Migration Rating/Update-Database.
161
+  

Laden…
Annuleren
Opslaan