zoukankan      html  css  js  c++  java
  • FluentAPI配置

    https://www.cnblogs.com/cuijl/p/6737815.html

    基本 EF 配置只要配置实体类和表、字段的对应关系、表间关联关系即可。

      如何利用 EF的高级配置,达到更多效果:如果数据错误(比如字段不能为空、字符串超长等),会在 EF 层就会报错,而不会被提交给数据库服务器再报错;如果使用自动生成数据库,也能帮助 EF 生成更完美的数据库表。这样的配置通过FluentAPI可以完成。

      尽 量 用 约 定 , EF 配 置 越 少 越 好 。

    1. 配置属性Length:

      Length用来描述数组的长度,当前包括string和Byte数组。

      默认约定:Code First对string或byte数组的默认长度约定是max。注意:Sql Server Compact中默认最大数组长度是4000。

      重写约定:使用HasMaxLength(nn),参数为可空整数。

    Property(t => t.Name).HasMaxLength(50);

    备注

    如 果 插 入 一 个 Person 对 象 , Name 属 性 的 值 非 常 长 , 保 存 的 时 候 就 会 报DbEntityValidationException 异常,这个异常的 Message 中看不到详细的报错消息,要看EntityValidationErrors 属性的值。

    复制代码
    var p = new Person();
    p.Name = "非常长的字符串";
    ctx.Persons.Add(p);
    try
    {
        ctx.SaveChanges();
    }
    catch(DbEntityValidationException ex)
    {
        StringBuilder sb = new StringBuilder();
        foreach(var ve in     ex.EntityValidationErrors.SelectMany(eve=>eve.ValidationErrors))
        {
            sb.AppendLine(ve.PropertyName+":"+ve.ErrorMessage);
        }
    Console.WriteLine(sb);
    }    
    复制代码

      2. 配置DataType:

      Data Type表示将.NET类型映射到的数据库的数据类型。

      默认约定:列的数据类型由使用的数据库提供程序决定。以SQL Server为例: String->nvarchar(max),Integer->int,Byte[]->varbinary(max),Boolean->bit。

      3. 配置是否为空

      默认约定:主键属性不允许为空,引用类型(String,array)允许为空,值类型(所有的数字类型,Datetime,bool,char)不允许为空,可空的值类型Nullable<T>允许为空。

      重写约定:使用IsRequired()配置不允许为空,使用IsOptional()配置允许为空。

      this.Property(p => p.Name).IsRequired() 属性不能为空;

      this.Property(p => p.Name).IsOptional() 属性可以为空;

      基于“尽量少配置”的原则:如果属性是值类型并且允许为null,就声明成 long?等,否则声明成 long 等;如果属性属性值是引用类型,只有不允许为空的时候设置 IsRequired()。

      4. 不常用的属性

      a)  主键: this.HasKey(p => p.Id);

      b)  某个字段不参与映射数据库: this.Ignore(p => p.Name1);

      c)  this.Property(p => p.Name).IsFixedLength(); 配置属性固定长度;IsMaxLength(),配置属性为数据库提供程序允许的最大长度。

      d)  this.Property(p => p.Name).IsUnicode(false) 对应的数据库类型是 varchar 类型,而不是nvarchar

      e)  this.Property(p => p.Id).HasColumnName("Id"); Id 列对应数据库中名字为 Id 的字段

      f)  this.Property(p  =>p.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity) 指定字段是自动增长类型。

    复制代码
    public UserConfig() {
    
                ToTable("T_Users");
    
                HasRequired(u => u.City).WithMany().HasForeignKey(u => u.CityId).WillCascadeOnDelete(false);
    
                Property(p => p.PasswordHash).IsRequired().HasMaxLength(100);
    
                Property(p => p.PasswordSalt).IsRequired().HasMaxLength(20);
    
                Property(p => p.PhoneNum).IsRequired().HasMaxLength(20).IsUnicode(false);
    
            }
    复制代码
  • 相关阅读:
    [转]在nodejs使用Redis缓存和查询数据及Session持久化(Express)
    [转]最常用的商务职场英语邮件100个句式
    [转]玩转Angular2(4)--制作左侧自动定位菜单
    [转]Angular开发(十八)-路由的基本认识
    Consul之:服务注册与发现
    Consul之:key/value存储
    服务容错保护断路器Hystrix之六:服务熔断和服务降级
    延时队列:Java中的DelayQueue
    分布式延迟消息队列实现分析与设计
    基于redis的延迟消息队列设计
  • 原文地址:https://www.cnblogs.com/Anthony518/p/12940955.html
Copyright © 2011-2022 走看看