首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Entity Framework 约定

例如我们上一小节中定义的类 Department,类中没有名称为id的属性,但是存在名称为类名称+id的属性***DepartmentId***,因此DepartmentId属性,将会被映射为自增长的主键...EF中定义关系要使用到导航属性,通过导航属性可以定义多个模型之间的关系。大部分情况下我们会将导航属性和外键属性结合在一起使用。...当EF检测出外键属性后,会根据外键属性是否为空来判断关系,如果外键可以为空,那么模型之间的关系将会配置成可选的,Code First 不会再关系上配置级联删除。...自定义约定可以看作全局约定规则,将会运用到所有实体和属性,也可以显示实现应用到指定的模型上。...,在模型创建之后用于操作对模型的存储,***自定义类约定***都必须在 OnModelCreating 方法中显式配置,例如我们要将模型中类型为DateTime的属性映射为datetime2,可进行如下配置

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    EntityFramework Core 学习扫盲

    Data Annotations 在自定义的MyContext中添加以下属性信息,并在每个自定义的实体名称上部增加[Table("XXX")],其中XXX为开发者指定的表名称。...备用键 Alternate Keys是EF CORE引入的新功能,EF 6.X版本中并没有此功能。备用键可以用作实体中除主键和索引外的唯一标识符,还可以用作外键目标。...在Fluent Api中,有两种方法可以指定备用键,一种是当开发者将实体中的属性作为另一个实体的外键目标,另一种是手动指定。EF CORE的默认约束是前者。...Post实体中的BlogUrl属性作为Blog对应Post的外键,指定Blog实体中的Url属性作为备用键(HasPrincipalKey方法将在下文的唯一标识节中讲解),此时Url将被配置为唯一列,扮演...再次重申一遍,备用键和主键有相似之处,它通常用来指定一个明确的外键目标——当开发者不想用单纯无意义的Id作为外键标识时。

    9.6K90

    EF 约定介绍

    当前环境为EF Code First开发模式中 一、EF默认约定 1、常用约定 (1)、当没有显示指定实体主键的时候,EF会默认将长得最像Id的属性(且类型为GUID)设为主键 (2)、设计实体时,当一个实体包含一个集合属性...} 3、主键约定(Primary Key Convention) 当没有显示指定实体主键的时候,EF会默认将长得最像Id的属性(且类型为GUID)设为主键,如果类中的属性(Property)名称为 ID...除了导航属性规定实体间的关系外,外键属性来式规定实体间方式的一种手段.Code First能够推断以下的命名属性为外键(优先级从上到下): (1)、导航属性名+关联实体的主键名 (2)、关联实体实体名+...关联实体的主键名 (3)、关联实体的主键名 注: (1)、当外键关系被检测到,Code First会根据外键的可空性来推断关系的具体形式;如果外键属性是可空的,那么关系会被设置为可选的,否则,关系就是必选的.... (2)、当关联实体的外键属性被设置为不为空,Code First会设置级联删除,反之不会。

    1.6K100

    C# 数据操作系列 - 6 EF Core 配置映射关系

    对于外键,如果在类里添加了引用类型,而这个引用类型也在EF的上下文中,EF会把这种属性称为导航属性。EF一旦在类里检索到了导航属性,就会去寻找对应的外键。...EF会认为 属性名+Id或者类名+Id 可能是外键属性,如果找到名称一致且类型与导航属性目标类的主键类型一致,则认为是外键。如果类型不一致,EF则认为该类设置有误。...如果没找到符合名称要求的属性,EF会自己添加一个外键属性。 对于一对一,EF要求导航属性双方都应该具有外键配置。 一对多,EF要求多的一方设置外键。...修改映射关系 EF允许开发人员指定自己的映射规则或者单个类的映射规则。EF 提供了几种方式来修改映射关系。 2.1 数据注解 EF允许开发人员通过使用Attribute标记,来约定映射关系。...所以通过分析API,我们可以得到这两种写法。 那么,这两种的取舍呢? 在项目比较小,数据类很少的时候,可以直接在OnModelCreating里写。

    2.8K21

    关于EF Code First模式不同建模方式对建表产生的影响

    今天在学EF Code First模式的时候,发现几个很有趣的问题,问题如下: 1、当编写玩实体后,不指定任何主键约束,EF会找长的最像Id的,然后设置其为主键,验证代码如下: //User类...结论:发现EF在我没有指定那个是主键的情况下,将UserId设为了主键 2、当一个实体中有两个带Id的字段,EF会将最像Id的设为主键,优先级  Id>UserId>UserId_Id class User...EF将Id设为了主键,UserId和UserId_Id的优先级自行验证. 3、关于外键的问题,当在实体中加入导航属性,EF生成外键可能会当前实体中的其他字段的影响.验证代码如下: class PhotoInfo...EF生成了一个User_Id的外键属性,关联User表 下面修改PhotoInfo实体,代码如下: class PhotoInfo { public Guid Id {...EF不再自动生成外键字段,而是将UserId属性设为了外键. 以上都是我测试出来的关于EF默认的行为,比较片面,欢迎指正.

    98760

    Entity Framework 系统约定配置

    Entity Framework 默认约定 1.将数据类的类名复数形式作为数据表名称,并且使用“dbo”作为默认架构。   ...3.使用导航属性约束两个表之间的关系,在从表数据类中除了导航属性,推荐定义一个外键属性在从表数据类中(如果不指定将默认生成一个“+”的外键列;此外在主表中推荐定义一个集合从表属性用户导航...,当然这个属性不定义也可以正常生成外键关系但是不利于使用),具体规则:“+”或者“+”又或者“”,其属性名不区分大小写并且如果出现多种匹配按照先后顺序匹配...;如果不存在外键属性则外键关系注册为可选的,否则注册为必选项并且此时将设置级联删除关系;如果在从表类中有多个导航属性对应同一个数据类那么需要使用fluent API或者Data Annotations进行手动配置...4.当EF按照上述规则在数据类中没有找到主键属性时(或者通过fluent API、Data Annotations没有定义)将认为此类为“复杂类型”。

    84020

    EntityFramework 外键值映射

    如果在 EF OnModelCreating 中配置了实体外键映射,也就是 SQL Server 中的 ForeignKey,那么我们在添加实体的时候,主实体的主键值会自动映射到子实体的外键值,并且这个操作在一个...SaveChanges 中,但如果没有在 OnModelCreating 中进行外键映射配置,我们添加实体的时候,就不会自动映射外键值了,什么意思呢?...中进行外键映射配置,所以生成到 SQL Server 的 db_school 数据库,会是这样: ?...就是实体更改了,需要进行 EF 迁移,如果你进行 EF 迁移的话,会发现,虽然我们没有在 OnModelCreating 中进行 ClassId 外键映射配置,但 EF 也会自动映射 ForeignKey...returns> Task FindByIDAsync(object id); 上面的外键统一定义为object类型,因为我们为了主键类型通用的考虑。

    4.2K50

    C# 数据操作系列 - 8. EF Core的增删改查

    如果需要后续变更,那么就需要在创建自定义EF Core 上下文类的时候,为之添加一个连接字符串的属性或者字段,以方便初始化的时候指定。...而删除,如果在配置导航属性时,没有设置级联删除,删除当前元素,如果另一端的外键是可空类型的,并不会删除导航属性另一端的元素只会设置外键指向为NULL,如果另一端外键是不可空的,那么就会同时删除。...如果需要修改,可以使用以下方法修改,在配置导航属性的时候: OnDelete(DeleteBehavior.Cascade); 对于可为NULL的外键来说,枚举DeleteBehavior的值起以下作用...: 行为名称 对内存中的依赖项/子项的影响 对数据库中的依赖项/子项的影响 Cascade 删除实体 删除实体 ClientSetNull(默认) 外键属性设置为 null None SetNull 外键属性设置为...null 外键属性设置为 null Restrict None None 而对于不可为NULL的外键来说,枚举DeleteBehavior的值起以下作用: 行为名称 对内存中的依赖项/子项的影响 对数据库中的依赖项

    3.2K20

    Entity Framework 一对多关系映射

    EF中关系映射也是一个很关键的内容,关系映射和属性映射一样,也是在 OnModelCreating 中配置映射。...一个客户可以有多个订单,但一个订单只能属于一个客户,所以我们用到了EF中的 HasRequired,一个客户又存在多个订单,因此也使用到了 WithMany ,同时 Order 表中有 CustomerId 作为外键...class CustomerMap : EntityTypeConfiguration { public CustomerMap() { //数据库映射的表名称...(modelBuilder); } 注1:在实际项目中需要编写很多的实体类,如果将所有实体类的映射直接写在 OnModelCreating 中会造成代码臃肿,不易维护,因此我们在这里将每个类的映射写在对应的映射文件中...,最后再将每个类的映射类注册到 OnModelCreating 中 注2:上述代码和描述是从客户的方向连编写的关系映射,如果以订单的角度来编写关系映射的话,只需删掉CustomerMap中的关系配置

    1K10

    Entity Framework 4.1 Code-First 学习笔记

    默认情况下,将在你的本地机器上,使用上下文对象名称,有许多方式来覆盖这个行为,最简单的方式是在配置文件中增加一个名字为上下文对象名称的数据库连接串,在我这里,叫做 MyDomainContext,还可以通过实现一个构造函数...通过构建器来覆盖默认约定,我们需要重写 DbContext 的一个方法 OnModelCreating: protectedoverridevoid OnModelCreating(DbModelBuilder...对于String类型的数据列,还可以指定数据的长度。...即使复杂类型的所有属性都是可空的,你也不能将整个复杂类型的对象设为 null, 例如,在这种情况下,即使街道的名称和街道的号码不是必填的,也不能有一个住宅的地址为 null,需要创建一个所有属性都是 null...每个类型一张表 TPT: 在继承层次中的每个类都分别映射到数据库中的一张表,彼此之间通过外键关联。

    1.6K10

    01-EF Core笔记之创建模型

    FluentAPI方式通过在OnModelCreating方法中添加代码逻辑来完成,也可以通过实现IEntityTypeConfiguration类来完成,方式灵活,更能更加强大。...数据标识方式只能配置主键,使用Key特性,备用键只能通过FluentAPI进行配置。...备用键可以是组合键,通过FluentAPI配置如下: modelBuilder.Entity() .HasAlternateKey(c => new { c.State, c.LicensePlate...}); //组合备用键 必填和选填 映射到数据库的必填和可空,在约定情况下,CLR中可为null的属性将被映射为数据库可空字段,不能为null的属性映射为数据库的必填字段。...public string TagId { get; set; } public Tag Tag { get; set; } } Blog和Tag是多对多的关系,显然无论在Blog或Tag中定义外键都不合适

    3.1K20
    领券