700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【EF】EF框架 Code First Fluent API

【EF】EF框架 Code First Fluent API

时间:2021-04-18 06:40:26

相关推荐

【EF】EF框架 Code First Fluent API

在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系。

要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreating方法,在此方法体内调用Fluent API。

如下面代码所示:

public class BlogDbContext : DbContext{ public BlogDbContext(): base("name=BlogDB"){}protected override void OnModelCreating(DbModelBuilder modelBuilder){//do somethingbase.OnModelCreating(modelBuilder);}}

下面来看一些简单的例子

主键

modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);

联合主键

//联合主键modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName });

字段非空

//要求属性必填modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();

设定字段最大长度

modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20);

设置复杂属性,相当数据特性中的ComplexType

plexType<Address>();

属性字段不映射到数据表字段,相当于数据特性中的NotMapped

modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty);

设置字段是否自动增长

//设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.NonemodelBuilder.Entity<BlogUser>().Property(user => user.UserId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

设置外键

///产生一对多的关系modelBuilder.Entity<Post>().HasRequired(p =>p.BlogUser).WithMany(user => user.Posts).HasForeignKey(p => p.UserId);///与上面等效//modelBuilder.Entity<BlogUser>()// .HasMany(user => user.Posts)// .WithRequired(p => p.BlogUser)// .HasForeignKey(p => p.UserId);

设定实体映射到数据库中的表名

modelBuilder.Entity<BlogUser>().ToTable("MyUser");

设置实体属性映射到数据库中的列名

modelBuilder.Entity<BlogUser>().Property(user => user.Description).HasColumnName("userDescription").HasColumnType("ntext");

下面给出完整代码,方便测试:

1 class FluentAPISample 2{ 3 4 static void Main(string[] args) 5 { 6 using (var db = new BlogDbContext()) 7 { 8 db.Database.Create(); 9 }10 }11}12 13public class BlogDbContext : DbContext14{ 15public BlogDbContext()16 : base("name=BlogDB")17 {18 Database.SetInitializer<BlogDbContext>(19 new DropCreateDatabaseIfModelChanges<BlogDbContext>()20 );21 }22protected override void OnModelCreating(DbModelBuilder modelBuilder)23{24 modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);25 //联合主键26 //modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName });27 28 //设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None29 modelBuilder.Entity<BlogUser>().Property(user => user.UserId)30 .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);31 32 //要求属性必填33 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();34 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20); 35 modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty);36 37 plexType<Address>();38 39 ///产生一对多的关系40 modelBuilder.Entity<Post>()41 .HasRequired(p =>p.BlogUser)42 .WithMany(user => user.Posts)43 .HasForeignKey(p => p.UserId);44 45 ///与上面等效46 //modelBuilder.Entity<BlogUser>()47 // .HasMany(user => user.Posts)48 // .WithRequired(p => p.BlogUser)49 // .HasForeignKey(p => p.UserId);50 51 modelBuilder.Entity<BlogUser>().ToTable("MyUser");52 53 modelBuilder.Entity<BlogUser>()54 .Property(user => user.Description)55 .HasColumnName("userDescription")56 .HasColumnType("ntext");57 58 base.OnModelCreating(modelBuilder);59}60}61 62public partial class BlogUser63{64 public int UserId { get; set; }65 public string BlogName { get; set; }66 public int MyProperty { get; set; }67 public Address Address { get; set; }68 public string Description { get; set; }69 public virtual ICollection<Post> Posts { get; set; }70}71public partial class Post72{73 public int PostId { get; set; }74 public string PostTitle { get; set; }75 public int UserId { get; set; }76 public BlogUser BlogUser { get; set; }77}78public partial class Address79{80 public string Province { get; set; }81 public string City { get; set; }82}

1 class FluentAPISample 2{ 3 4 static void Main(string[] args) 5 { 6 using (var db = new BlogDbContext()) 7 { 8 db.Database.Create(); 9 }10 }11}12 13public class BlogDbContext : DbContext14{ 15public BlogDbContext()16 : base("name=BlogDB")17 {18 Database.SetInitializer<BlogDbContext>(19 new DropCreateDatabaseIfModelChanges<BlogDbContext>()20 );21 }22protected override void OnModelCreating(DbModelBuilder modelBuilder)23{24 modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);25 //联合主键26 //modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName });27 28 //设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None29 modelBuilder.Entity<BlogUser>().Property(user => user.UserId)30 .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);31 32 //要求属性必填33 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();34 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20); 35 modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty);36 37 plexType<Address>();38 39 ///产生一对多的关系40 modelBuilder.Entity<Post>()41 .HasRequired(p =>p.BlogUser)42 .WithMany(user => user.Posts)43 .HasForeignKey(p => p.UserId);44 45 ///与上面等效46 //modelBuilder.Entity<BlogUser>()47 // .HasMany(user => user.Posts)48 // .WithRequired(p => p.BlogUser)49 // .HasForeignKey(p => p.UserId);50 51 modelBuilder.Entity<BlogUser>().ToTable("MyUser");52 53 modelBuilder.Entity<BlogUser>()54 .Property(user => user.Description)55 .HasColumnName("userDescription")56 .HasColumnType("ntext");57 58 base.OnModelCreating(modelBuilder);59}60}61 62public partial class BlogUser63{64 public int UserId { get; set; }65 public string BlogName { get; set; }66 public int MyProperty { get; set; }67 public Address Address { get; set; }68 public string Description { get; set; }69 public virtual ICollection<Post> Posts { get; set; }70}71public partial class Post72{73 public int PostId { get; set; }74 public string PostTitle { get; set; }75 public int UserId { get; set; }76 public BlogUser BlogUser { get; set; }77}78public partial class Address79{80 public string Province { get; set; }81 public string City { get; set; }82}

运行结果如下图示:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。