1. dotnet ef相关命令
删除数据库(适合只有一个数据库的情形)
dotnet ef database drop --force
更新数据库(适合只有一个数据库的情形)
dotnet ef database update
如果多个数据库,则需更改:
首先,查看有哪些数据库context:
dotnet ef dbcontext list
> dotnet ef dbcontext list info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0] User profile is available. Using 'C:Userszte_preAppDataLocalASP.NETD ....... dName] FROM [AspNetRoles] AS [r] WHERE [r].[NormalizedName] = @__normalizedName_0 SportsStore.Models.IdentityDataContext SportsStore.Models.DataContext
在对具体的数据库进行操作:
dotnet ef database drop --force --context IdentityDataContext
和
dotnet ef database update --context IdentityDataContext
1.2 数据迁移
第一次是初始化:
dotnet ef migrations add Initial
随后开发的过程中增加表时,迁移是增加相应的表名:
dotnet ef migrations add ChangeDeleteBehavior
从多个数据库的话,要选择数据库上迁移建立表:
dotnet ef migrations list --context DataContext
dotnet ef migrations add Orders --context DataContext
如果发现迁移的表不正确,可以把Migrations目录下的相关的cs文件删除,如Orders发现数据库里设计的不对,重新migrate时,可以删除如下两个文件,重新运行迁移命令即可:
......Migrations20181015071529_Orders.cs
......Migrations20181015071529_Orders.Designer.cs
2 .appsetting
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Microsoft.EntityFrameworkCore": "Information",
"Microsoft.AspNetCore.NodeServices": "Information",
"Default": "Warning"
},
"Data": {
"Products": {
"ConnectionString": "Server=(localdb)\MSSQLLocalDB;Database=SportsStoreAngular;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
}
}
dotnet sql-cache create "Data Source=(localdb)MSSQLLocalDB;Database=SportsStoreAngular;Trusted_Connection=True;MultipleActiveResultSets=true" "dbo" "SessionData"
Trusted_Connection=True;这句不加,就出现了”管道的另一端上无任何进程“的错误,估计跟用户校验相关。
另外注意:
在有用户密码的数据库中,使用如下命令:
dotnet sql-cache create 'Data Source=localhost,1433;Database=SimpleGlossary;User Id=sa;password="dusf123SQL!";MultipleActiveResultSets=true' 'dbo' 'SessionData'
注意上面语句的单引号里面是双引号,主要是解决密码里有个!特殊字符,命令行不识别的问题
2.angular-cli创建MVC项目
dotnet new mvc --language C# --auth None --framework netcoreapp2.0 dotnet add package Microsoft.AspNetCore.SpaServices dotnet add package Microsoft.EntityFrameworkCore --version 1.1.1 dotnet add package Microsoft.EntityFrameworkCore.Design --version 1.1.1 dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 1.1.1
3. npm的镜像替换成淘宝
1.得到原本的镜像地址
npm get registry
> https://registry.npmjs.org/
设成淘宝的
npm config set registry http://registry.npm.taobao.org/
yarn config set registry http://registry.npm.taobao.org/
2.换成原来的
npm config set registry https://registry.npmjs.org/
4.关于循环引用的问题
11. public Product GetProduct(long id) { Product result = context.Products .Include(p => p.Supplier) .Include(p => p.Ratings) .First(p => p.ProductId == id); if (result != null) { if (result.Supplier != null) { result.Supplier.Products = null; } if (result.Ratings != null) { foreach (Rating r in result.Ratings) { r.Product = null; } } } return result; } 22. public Product GetProduct(long id) { Product result = context.Products .Include(p => p.Supplier).ThenInclude(s => s.Products) .Include(p => p.Ratings) .First(p => p.ProductId == id); if (result != null) { if (result.Supplier != null) { result.Supplier.Products = result.Supplier.Products.Select(p => new Product { ProductId = p.ProductId, Name = p.Name, Category = p.Category, Description = p.Description, Price = p.Price, }); } if (result.Ratings != null) { foreach (Rating r in result.Ratings) { r.Product = null; } } } return result; } }
上面11和22的代码区别是,22多了个ThenInclude(s => s.Products). Inlclude和ThenInclude都是表示让EF装载关联数据的。Include只关联和id相等的产品信息,即11中的Supllier的Products有多个product的话,只会关联出
productId和查询id一直的产品,并不会把所有的与该supplier关联的产品装载出来。与此对应的结果如下所示:
11. { "productId":1,"name":"Kayak","category":"Watersports", "description":"A boat for one person","price":275.00, "supplier":{ "supplierId":1,"name":"Splash Dudes","city":"San Jose", "state":"CA","products":null}, "ratings":[{"ratingId":1,"stars":4,"product":null}, {"ratingId":2,"stars":3,"product":null}] } 22. { "productId":1,"name":"Kayak","category":"Watersports", "description":"A boat for one person","price":275.00, "supplier":{"supplierId":1,"name":"Splash Dudes","city":"San Jose", "state":"CA", "products":[ { "productId":1,"name":"Kayak","category":"Watersports", "description":"A boat for one person", "price":275.00, "supplier":null,"ratings":null}, { "productId":2,"name":"Lifejacket","category":"Watersports", "description":"Protective and fashionable","price":48.95, "supplier":null,"ratings":null}]}, "ratings":[{"ratingId":1,"stars":4,"product":null}, {"ratingId":2,"stars":3,"product":null}] }
5.关于数据库删除相关数据的行为问题
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Product>().HasMany<Rating>(p => p.Ratings) .WithOne(r => r.Product).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity<Product>().HasOne<Supplier>(p => p.Supplier) .WithMany(s => s.Products).OnDelete(DeleteBehavior.SetNull); }
如上所示,OnModelCreating函数会重载对数据库操作行为的默认定义。里面的第一句可以将解释为,针对Product实体,它有多个Rating的关联实体,每个Rating实体关联一个Product实体。如果删除Product实体,Rating的实体必须同时删掉。
第二句解释为:针对Product实体,它有一个Supplier的关联实体,每个Supplier实体关联多个Product实体。如果删除Product实体,Supplier的实体设置为null。
6.待解决的问题
- 其他url不能直接跳转到主页
- checkout的几个步骤,刷新页面都会跳到购物车
- Admin的几个页面直接输入url,会切换到用户登录页面; 每次即使已经输入用户密码仍是这样;为什么不能保存用户密码,而要每次输入呢
7. json
. cs里JsonConvert.SerializeObject(products);将对象转化成json的字符串
public static object DeserializeObject(string value);
js里:JSON.stringify(this.newProduct); 将对象转换成json的字符串
如:
JSON.stringify({}); // '{}' JSON.stringify(true); // 'true' JSON.stringify("foo"); // '"foo"' JSON.stringify([1, "false", false]); // '[1,"false",false]' JSON.stringify({ x: 5 }); // '{"x":5}' 相反的过程函数是 JSON.parse("string") JSON.parse('{}'); // {} JSON.parse('true'); // true JSON.parse('"foo"'); // "foo" JSON.parse('[1, 5, "false"]'); // [1, 5, "false"] JSON.parse('null'); // null JSON.parse('1'); // 1