排除属性:NotMapped
NotMapped:排除属性在CodeFirst的时候在数据库里不创建该属性
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[NotMapped]
public DateTime LoadedFromDatabase { get; set; }
}
主键设置,最大长度
按照约定,属性名为 Id
或 者包含“Id"("CarId")
的会配置为实体的键。
例如
public int CarId{ get; set; }
可以使用“ [Key]”将单个属性配置为实体的键。
class Car
{
[Key]
public string LicensePlate { get; set; }
[MaxLength(500)] //最大长度
public string Make { get; set; }
public string Model { get; set; }
}
值生成模式 丶必须属性 数据注释方式
- 无值生成:必须在add数据的时候该项必须赋值(需始终提供要保存到数据库的有效值。 必须先将有效的值赋予新的实体,再将这些新的实体添加到上下文中)。
- 在添加时生成值:在添加时生成值,有客户端生产值,或者由数据库生成。
- 在添加或更新时生成值:在添加或更新时生成值,意味着在每次保存该记录(插入或更新)时生成新值。
public class Blog { [DatabaseGenerated(DatabaseGeneratedOption.None)] //无值生成 public int BlogId { get; set; }
[Required]//必须 public string Url { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] //在添加时生成值 public DateTime Inserted { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] //在添加或更新时生成值 public DateTime LastUpdated { get; set; } }并发标记 丶隐藏属性
- 属性配置为并发标记用于实现乐观并发控制。https://docs.microsoft.com/zh-cn/ef/core/saving/concurrency 暂时未用到具体如何实现并发控制
-
public class Person { public int PersonId { get; set; } [ConcurrencyCheck] public string LastName { get; set; } public string FirstName { get; set; } }
隐藏属性又叫阴影属性,这个属性的作用就是在数据库表里面 LastUpdateTime的值为null的时候,不应在映射的实体类型公开数据库中没有数据时,卷影属性非常有用。这时微软的解释,如何配置数据注释并没有标明如何注释 可以使用Fluent API配置
class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property<DateTime>("LastUpdated");
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
关系:https://docs.microsoft.com/zh-cn/ef/core/modeling/relationships
索引
利用FluentApI创建索引
class MyContext : DbContext { public DbSet<Person> People { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Person>() .HasIndex(p => new { p.FirstName, p.LastName }); //多个列指定一个索引。
//modelBuilder.Entity<Blog>() .HasIndex(b => b.Url); //单个属性指定索引
//modelBuilder.Entity<Blog>() .HasIndex(b => b.Url) .IsUnique(); //此外可以指定索引应是唯一的这意味着任何两个实体可以具有给定属性的相同值。
} } public class Person { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } }
备用键
官方文档解释:备用键与主键相对,用作每个实体实例的备用唯一标识符。 备用键可用作关系的目标。 使用关系数据库时,这将映射到备用键列上的唯一索引/约束和引用列的一个或多个外键约束的概念。
利用FluentApi进行配置
class MyContext : DbContext
{
public DbSet<Car> Cars { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Car>()
.HasAlternateKey(c => c.LicensePlate);
//modelBuilder.Entity<Car>()
.HasAlternateKey(c => new { c.State, c.LicensePlate });//可用于配置要作为备用键 (称为复合的备用键) 的多个属性。
}
}
class Car
{
public int CarId { get; set; }
public string LicensePlate { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}