• Essential pro angular and asp.net core 笔记


    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);

      public static string SerializeObject(object 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
  • 相关阅读:
    javascript 模板系统 ejs v2
    三国观后感
    《非诚勿扰》乐嘉老师送给男生女生的话:
    正则学习笔记6
    硬链接和符号链接
    javascript 模板系统 ejs v1
    javascript模板系统 ejs v3
    程序员编程艺术:第八章、从头至尾漫谈虚函数
    程序员编程艺术第十一章:最长公共子序列(LCS)问题
    编程艺术第二十三~四章&十一续:杨氏矩阵查找,倒排索引关键词Hash编码
  • 原文地址:https://www.cnblogs.com/dusf/p/9698631.html
Copyright © 2020-2023  润新知