Code First 数据注释
ComplexType
public class BlogDetails
{
public DateTime?DateCreated { get; set; }
[MaxLength(250)]
public string Description { get; set; }
}
请注意,BlogDetails 没有任何键属性类型。在域驱动的设计中,BlogDetails 称为值对象。实体框架将值对象称为复杂类型。复杂类型不能自行跟踪。
但是 BlogDetails 作为 Blog 类中的一个属性,将作为 Blog 对象的一部分被跟踪。为了让 Code First 认识到这一点,您必须将 BlogDetails 类标记为 ComplexType。
[ComplexType]
public class BlogDetails
{
public DateTime?DateCreated { get; set; }
[MaxLength(250)]
public string Description { get; set; }
}
ConcurrencyCheck
ConcurrencyCheck
注释可用于标记要在用户编辑或删除实体时用于在数据库中进行并发检查的一个或多个属性。即在数据中筛选时还将加上标记了该特性的字段。
TimeStamp
使用 rowversion 或 timestamp 字段来进行并发检查更为常见。Code First 将 Timestamp 属性与 ConcurrencyCheck 属性同等对待,但它还将确保 Code First 生成的数据库字段是不可为空的。在一个指定类中,只能有一个 timestamp 属性。
[Timestamp]
public Byte[] TimeStamp { get; set; }
关联特性InverseProperty 和 ForeignKey
生成数据库时,Code First 会在 Post 类中看到 BlogId 属性并识别出该属性,按照约定,它与类名加“Id”匹配,并作为 Blog 类的外键。但是在此 Blog 类中没有 BlogId 属性。解决方法是,在 Post 中创建一个导航属性,并使用 Foreign DataAnnotation 来帮助 Code First 了解如何在两个类之间创建关系(那就是使用 Post.BlogId 属性)以及如何在数据库中指定约束。
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
[ForeignKey("BlogId")]
public Blog Blog { get; set; }
public ICollection<Comment> Comments { get; set; }
}
DatabaseGenerated
将字段设置为递增的 DatabaseGenerated.Identity
某个字段是计算得到的 DatabaseGenerated.Computed
取消 DatabaseGenerated.None