相关文章推荐
内向的馒头  ·  Outlook PST File ...·  1 年前    · 
打酱油的荒野  ·  vba 判断 星期几-掘金·  1 年前    · 

数据模型通过EF Core映射成数据库表, 使我们不必通过SQL语句既可操作数据库.

  • 模型中只有get访问器的字段在映射时不会创建数据库列
  • 实体的导航属性用于创建数据库的外键
  • 关于限制级联删除规则
    比如这样一个数据模型: 一所大学里系(Department)拥有一个系主任外键(Department.InstructorID), 系主任由一位讲师担任(Instructor.ID).
    如果将 Department.InstructorID 属性定义为不可为 null,EF Core 将配置级联删除规则。 在这种情况下,指定为系主任的讲师被删除时,该系将被删除。 在这种情况下,限制规则将更有意义。 以下 fluent API 将设置限制规则并禁用级联规则。
  • 多对多关系
    实体之间的多对多关系一般要在中间建立一个联接表(JT)拆解为一对多关系。 联接表分为“具有有效负载”的多对多联接表和无有效负载的多对多联接表(纯联接表 PJT)。
    注意:EF 6.x 支持多对多关系的隐式联接表,但 EF Core 不支持
modelBuilder.Entity<Department>()
   .HasOne(d => d.Administrator)
   .WithMany()
   .OnDelete(DeleteBehavior.Restrict)
  • 关于组合键
    联接表中的两个 FK可共同唯一标识 表中的每一行, 因此不需要专用的 PK。 两个FK属性充当组合 PK。 使用 Fluent API 是向 EF Core 指定组合 PK 的唯一方法 .
protected override void OnModelCreating(ModelBuilder modelBuilder)
            modelBuilder.Entity<CourseAssignment>()
                .HasKey(c => new { c.CourseID, c.InstructorID });

如果联接实体定义其自己的 PK,因此可能会出现重复的FK组合。 若要防止此类重复:
请在 FK 字段上添加唯一索引

  • 新增模型应用迁移时, 可能会出现"外键不能为空"冲突, 可通过在UP方法中增加临时数据来解决

一. 在模型定义中使用特性(Attribute)

1. DataType特性
DataType 特性指定比数据库内部类型更具体的数据类型.
例如:

[DataType(DataType.Date)]

数据库中DateTime类型含有日期和时间, 我们可通过DateType特性指定模型字段只包含日期.
DataType 可提供多种数据类型:

字段类型
CreditCard表示信用卡号码。
Currency表示货币值。
Custom表示自定义的数据类型。
Date表示日期值。
DateTime表示某个具体时间,以日期和当天的时间表示。
Duration表示对象存在的一段连续时间。
EmailAddress表示电子邮件地址。
Html表示一个 HTML 文件。
ImageUrl表示图像的 URL。
MultilineText表示多行文本。
Password表示密码值。
PhoneNumber表示电话号码值。
PostalCode表示邮政编码。
Text表示所显示的文本。
Time表示时间值。
Upload表示文件上载数据类型。
Url表示 URL 值。

2. DisplayFormat 特性

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
  • DisplayFormat 特性用于显式指定日期格式。
  • ApplyFormatInEditMode 设置指定还应对编辑 UI 应用该格式设置
  • 搭配使用 DataType 特性和 DisplayFormat 特性通常是很好的做法

3. StringLength 特性

[StringLength(50, ErrorMessage = "First name cannot be longer than 50 characters.")]

指定数据验证规则和验证错误消息。 StringLength 特性指定数据字段中允许的字符的最小长度和最大长度。
如要精确指定输入格式, 可使用RegularExpression 特性

[RegularExpression(@"^[A-Z]+[a-zA-Z""'\s-]*$")]

4. Column 特性

  • 默认模型的属性名即数据库的列名, 使用Column特性可更改数据库列名.
[Column("FirstName")]
public string FirstMidName { get; set; }
  • Column 特性还可用于更改 SQL 数据类型映射
[Column(TypeName="money")]
public decimal Budget { get; set; }

5. Required 特性
指定属性为必填字段

6. Display 特性

[Display(Name = "Last Name")]

指定UI的标题显示名

7. Key 特性
按照命名约定: ID 或 classnameID 属性自动被识别为主键(PK).
[Key] 特性用于在属性名不是 classnameID 或 ID 时将属性标识为主键 (PK)。

8. DatabaseGenerated 特性

  • 默认情况下,EF Core 假定 PK 值由数据库生成。 数据库生成通常是最佳方法
  • [DatabaseGenerated(DatabaseGeneratedOption.None)] 特性指定 PK 由应用程序提供而不是由数据库生成。
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Display(Name = "Number")]
public int CourseID { get; set; }
  • DatabaseGenerated 特性还可用于生成默认值。 例如,数据库可以自动生成日期字段以记录数据行的创建或更新日期

二. 通过模型查询数据库中数据

  1. 外键关联的连接表中数据的加载

模型实体通过导航属性关联连接表, 连接表数据的加载有以下几种方式:

  • 预先加载。 预先加载是指对查询某类型的实体时一并加载相关实体。 EF Core 将针对预先加载的某些类型发出多个查询。 发布多个查询可能比发布大型的单个查询更为有效。 预先加载通过 Include 和 ThenInclude 方法进行指定。
    在这里插入图片描述
    Include 方法将加载连接表中的所有数据。 如果只想加载部分数据可使用Select 方法(需构造一个ViwModel类)。 对于单个项(如 Department.Name),它使用 SQL INNER JOIN。
public IList<CourseViewModel> CourseVM { get; set; }
public async Task OnGetAsync()
    CourseVM = await _context.Courses
            .Select(p => new CourseViewModel
                CourseID = p.CourseID,
                Title = p.Title,
                Credits = p.Credits,
                DepartmentName = p.Department.Name
            }).ToListAsync();
  • 使用 Load 的单独查询:可在单独的查询中检索数据,EF Core 会“修复”导航属性。 “修复”是指 EF Core 自动填充导航属性。 使用 Load 单独查询比预先加载更像是显式加载。
    在这里插入图片描述
  • 显式加载。 首次读取实体时,不检索相关数据。 可编写代码在需要时检索相关数据。 使用单独查询进行显式加载时,会向数据库发送多个查询。 该代码通过显式加载指定要加载的导航属性。 使用 Load 方法进行显式加载。
    在这里插入图片描述
  • 延迟加载。 延迟加载已添加到版本 2.1 中的 EF Core。 首次读取实体时,不检索相关数据。 首次访问导航属性时,会自动检索该导航属性所需的数据。 首次访问导航属性时,都会向数据库发送一个查询。
数据模型通过EF Core映射成数据库表, 使我们不必通过SQL语句既可操作数据库.模型中只有get访问器的字段在映射时不会创建数据库列实体的导航属性用于创建数据库的外键关于限制级联删除规则比如这样一个数据模型: 一所大学里系(Department)拥有一个系主任外键(Department.InstructorID), 系主任由一位讲师担任(Instructor.ID).如果将 Dep... 隐式Razor表达式 写法: @后直接跟C#代码 除了await之外,隐式表达式中不能有空格 <p>@await DoSomething("hello", "world")</p> 隐式表达式也能使用泛型,因为尖括号会被解析为html,可以放在显式表达式,或代码块中 显式Razor表达式 写法:@() <p>Last week this ti @model Demo.Pages.RegisterModel 在RegisterModel上F12转到定义,可以知道RegisterModel其实是一个类,继承自PageModel。 (演示:略) 注意其命名规范:类名同Page名,后加Model后缀 此外,注意: 组合之后的page可以有多个@model声明,但只能有一个@page声明 Handler Methods PageModel可以自
什么是PageModel? PageModel是ASP.NET Core Razor Pages应用程序中特有的页面模型文件,它通常与Razor页面文件关联在一起。按照约定,PageModel的命名方式为Razor页面文件xxx.cshtml后面再加上.cs后缀,比如当前有Razor页面文件:[/Pages/Index.cshtml],那么对应的PageModel页面模型文件则为:[/Pages/Index.cshtml.cs]。 为什么使用PageModel模型页面? 对于Razor Pages应用程序的
ASP .NET Core 系列教程四:使用数据库进行交互 系列文章目录:系列教程:使用ASP.NET Core创建Razor Pages Web应用程序 - zhangpeterx的博客
本教程介绍如何创建使用 Entity Framework (EF) Core 进行数据访问的 ASP.NET Core Razor Pages Web 应用。 Razor 页面是 ASP.NET Core MVC 的一个新特性,它可以使基于页面的编码方式更简单高效。 Entity Framework (EF) Core 是轻量化、可扩展和跨平台版的常用 Entity Framework 数据访问技术。 EF Core 可用作对象关系映射程序 (O/RM),以便于 .NET 开发人员能够使用 .NET 对象来处理数据库,这样就不必经常编写大部分数据访问代码了。
前言上次,我们发现《DateOnly 和 TimeOnly 类型居然不能序列化》。但问题还不仅仅如此。问题重现假设有下列实体类:publicclassUser publicintId{get;set;} publicstringName{get;set;} publicDateOnlyBirthd...
设置主键。如果为int类型,将自动设置为自增长列。 系统默认以Id或类名+Id作为主键。StringLengthAttribute 可设置最大最小长度以及验证提示信息等。最大长度会映射到数据库。MaxLengthAttribute 最大长度。会映射的数据库。ConcurrencyCheckAttribute ...
Razor商城源码是一个用于建立和管理电子商务网站的源代码。它提供了一个完整的解决方案,可以帮助用户创建一个功能齐全的在线商城。 Razor商城源码具有多种功能和特点。首先,它提供了一个直观和易于使用的界面,使用户可以轻松地浏览和购买商品。用户可以通过搜索、分类、筛选等方式找到所需商品,并将其加入购物车进行结算。 此外,Razor商城源码还提供了强大的后台管理功能。管理员可以轻松添加、编辑和删除商品信息,管理库存和订单,以及跟踪销售和收入。他们还可以配置网站的外观和布局,以便更好地满足用户需求。 Razor商城源码还支持多种支付方式,例如信用卡、支付宝等。这样,用户可以选择最方便的支付方式来完成交易。同时,系统还提供了安全的支付环境,保护用户的个人和财务信息不受任何不良行为的侵犯。 此外,Razor商城源码还支持多语言和多货币。这使得用户可以根据自己的偏好选择使用不同的语言和货币进行购物。这对于国际买家来说尤为重要,因为它能够为他们提供一个更加友好和便利的购物环境。 总而言之,Razor商城源码是一个强大而全面的电子商务解决方案,它提供了一个完整的平台,使用户能够方便地创建和管理自己的在线商城。无论是对于个人创业者还是大型企业,Razor商城源码都可以满足他们的需求,帮助他们建立成功的电子商务业务。 ### 回答2: Razor商城源码是一种电商平台的代码,用于搭建一个完整的在线购物商城。它包含了前后端的代码及相关的数据库设计,可以使开发人员快速搭建起一个功能完善的电商平台。 Razor商城源码的前端代码通常使用HTML、CSS和JavaScript来构建用户界面,它通过响应式设计可以适应不同设备的屏幕尺寸,提供更好的用户体验。前端代码还包含了商品展示、搜索、购物车、结算等功能,使用户可以轻松地浏览和购买商品。 后端代码主要使用一种常见的服务器端编程语言(如Java、PHP、Python等)来实现核心的功能,例如用户认证、订单处理和数据库管理等。后端代码还涉及到支付接口的集成,以便实现在线支付功能。另外,后端代码还需要处理一些业务逻辑,例如促销活动、库存管理和订单跟踪等。 Razor商城源码的数据库设计是整个电商平台的核心,用于存储商品信息、用户信息、订单信息等。一般来说,它使用关系型数据库(如MySQL、PostgreSQL等)来存储数据,并采用适当的表结构和关联关系来保证数据的完整性和一致性。 使用Razor商城源码,开发人员可以根据具体的需求进行定制和扩展,以满足自己的商城项目的特殊要求。同时,它还提供了一些配置文件和文档,帮助开发人员更好地理解和使用源码。 总之,Razor商城源码是一个可定制的电商平台代码,在实现在线购物商城的过程中提供了一套成熟的解决方案,帮助开发人员快速搭建起一个功能完善的电商网站。 楼主,我现在的问题是RuntimeError: The R home directory could not be determined. Try to install R <https://www.r-project.org/>, set the R_HOME environment variable to the R home directory, or add the directory of the R interpreter to the PATH environment variable. [13816] Failed to execute script main是这样的,我自己的电脑运行时好的,别人的报错请问是什么原因
EF Core问题: 通过依赖注入的数据上下文执行异步SaveChangesAsync抛出异常 zhijiacn: 碰到类似的问题,启动时保存可以成功,退出时保存就卡住了,同步方法可以执行,一步就卡住