目录

[简介][1]

[配置实体的属性][2]

[配置实体间的引用关系][3]

[配置数据库映射][4]

 

配置方法介绍

在 Code First 之前,其实大家都知道一种配置方法:

class AnimalType
{
  public int Id { get; set; }
  [Required]
  public string TypeName { get; set; }
}

没错,这就是 Code First 的配置方法之一:Data Annotations

直译叫做数据批注,原理就是在对应的字段上加上 System.ComponentModel.DataAnnotations 命名空间下的一些 Attribute,就可以实现各种配置了。

这种作法在 Model First 和 Database First 的时代就有了,也可以同时被用来做 MVC 的数据验证。

另外一种配置方法叫做:Fluent API

这个实在不好翻译,我更喜欢称呼它的原名。

示例如下:

class VetContext:DbContext
{
  public DbSet<Patient> Patients { get; set; }
  public DbSet<Visit> Visits { get; set; }
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Entity<AnimalType>()
                .ToTable("Species");
    modelBuilder.Entity<AnimalType>()
                .Property(p => p.TypeName).IsRequired();
   }
}

 

那最终到底选择哪种呢?

个人建议还是选择 Fluent API。

因为它提供的功能更多;而且它可以完全脱离 Model,便于分层,EF 是仓促层的东西,尽量不要入侵 Model。

所以它非常适合 DDD,这里有一位高人的实例程序,非常的棒:传送门

 

属性长度

Convention max (type specified by database)
Data Annotation MinLength(nn)
MaxLength(nn)
StringLength(nn)
Fluent Entity.Property(t=>t.PropertyName).HasMaxLength(nn) </td> </tr> </table> 长度是用来描述 `String`或者 `Byte`数组的,默认会被设置成对应类型的最大值。例如在 SQL Server 中,它们分别会被设置成 `nvarchar(max)` 和 `varbinary(max)`。   ### 数据类型
Convention 根据不同的数据提供者,会有不同的默认数据类型。
在 SQL Server 中:
String : nvarchar(max)
Integer : int
Byte Array : varbinary(max)
Boolean : bit
Data Annotation Column(TypeName=“xxx”)
Fluent Entity.Property(t=>t.PropertyName).HasColumnType (“xxx”) </td> </tr> </table>   ### 可空配置
Convention 主键、外键: 不为空
引用类型 (String, arrays): 可空
值类型 (all numeric types, DateTime, bool, char) : 不为空
Nullable  : 可空 </td> </tr>
Data Annotation Required
Fluent Entity.Property(t=>t.PropertyName).IsRequired </td> </tr> </table>   ### 主键映射
Convention 命名为 Id 的属性
命名为 [类型名] + Id 的属性
Data Annotation Key
Fluent Entity.HasKey(t=>t.PropertyName) </td> </tr> </table>   ### 配置标识规范属性
Convention 数据库默认标识规范
Data Annotation DatabaseGenerated(DatabaseGeneratedOption)
Fluent Entity.Property(t=>t.PropertyName)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption) </td> </tr> </table>   ### 为乐观并发配置 TimeStamp/RowVersion 字段
Convention
Data Annotation TimeStamp
Fluent Entity.Property(t=>t.PropertyName).IsRowVersion() </td> </tr> </table>   ### 为没有 Timestamp 的字段配置乐观并发
Convention
Data Annotation ConcurrencyCheck
Fluent Entity.Property(t=>t.PropertyName).IsConcurrencyToken() </td> </tr> </table>   ### 配置非Unicode的数据库类型
Convention 所有的 String 都会被配制成 Unicode 编码的数据库类型
Data Annotation 无法配置
Fluent Entity.Property(t=>t.PropertyName).IsUnicode(boolean) </td> </tr> </table>   ### 配置 Decimals
Convention Decimals 18, 2
Data Annotation 无法配置
Fluent Entity.Property(t=>t.PropertyName).HasPrecision(n,n) </td> </tr> </table>   ### 配置复杂类型 这块比较复杂,也比较少用,感兴趣的可以去翻阅原文。 [1]: /2012/09/entity-framework-code-first-configuring-intro/ "Entity Framework Code First 配置介绍" [2]: /2012/09/entity-framework-code-first-configuring-property/ "Entity Framework Code First 配置介绍:属性" [3]: /2012/09/entity-framework-code-first-configuring-relationships/ "Entity Framework Code First 配置介绍:引用关系" [4]: /2012/09/entity-framework-code-first-configuring-database-mappings/ "Entity Framework Code First 配置介绍:数据库映射"

本作品由 Dozer 创作,采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。