Entity Framework实体到表的高级映射

1. 映射表名和列明

[Table("People")]
public class PersonPhoto {
…    
    [Column("CaptionName")]
    public string Caption { get; set; }
…  
}
如果还需要指定schema名称:
[Table("Locations", Schema="baga")]
public class Destination{...}
 
Fluent API
ToTable("People", "tvl");
Property(t => t.Caption ).HasColumnName("CaptionName");







2. 多实体映射到单表

[Table("People")]
public class Person {
   ...
    [Required]
    public PersonPhoto Photo { get; set; }
}

[Table("People")]
public class PersonPhoto {
    [Key]
    [ForeignKey("PhotoOf")]
    public int PersonId { get; set; }
   ...
}

这里需要强调的是

1. 实体间一对一的关系;
2. 这里Person类里面的Photo字段必须使用Required修饰,否则无效;
3. 实体都使用显示的声明属性、配置来命名。(否则隐性将会导致其重复命名的表名后面加1,比如Person默认表名就是Person,如果没有显示声明表名为People,将会别改名为People1)

Lazy Load

如上类所示,想要加载Photo,需要通过context.People.Include("Photo")来加载。但是如果声明如下(使用virtual修饰):

[Required]
public virtual PersonPhoto Photo { get; set; }

则默认的行为是Lazy Load的方式,当通过

var people = context.People.ToList();
var firstPerson = people[0];
SomeCustomMethodToDisplay(firstPerson.Photo.Caption);
方式访问Photo将会实时的访问数据库取回Photo信息,如果不声明virtual,上例将会抛出异常。

Fluent API:

modelBuilder.Entity<Person>().ToTable("People");
modelBuilder.Entity<PersonPhoto>().ToTable("People");

3. 单实体映射到多表

 public class DestinationConfig : EntityTypeConfiguration<Destination> { 
     public DestinationConfig(){
         Map(m => {
             m.Properties(d => new { d.Name, d.Country,d.Description });
             m.ToTable("Locations");
         });
         Map(m => {
             m.Properties(d => new {d.Photo });
             m.ToTable("LocationPhotos");
         });
     }
 }

image

image

image

 

4. 如何实现实体到数据库表的映射

1. 在DbContext的继承类中,通过Dbset暴露出来;
2. 以着关联类的形式,在符合第一条的类中出现;
3. 以着Fluent API的形式在OnModelCreating方法中定义或者成为modelBuilder.Configurations中的添加类,如果这样的实体需要使用EntityTypeConfiguration定义一下。

posted on 2013-04-07 21:42  张叫兽的技术研究院  阅读(787)  评论(0编辑  收藏  举报

导航