EntityFrameWork CodeFirst
1.创建POCO
public class Book { public int BookID { get; set; } public string BookName { get; set; } public byte[] RowVersion { get; set; } public Person Owner { get; set; } } public class Order { public string OrderID { get; set; } public string OrderName { get; set; } public List<OrderDetails> OrderDetails { get; set; } } public class OrderDetails { public int OrderDetail { get; set; } public string ProductName { get; set; } public string FK_OrderDetail_Order { get; set; } public Order Order { get; set; } } public class Person { public int PersonID { get; set; } public byte[] Version { get; set; } public string PersonName { get; set; } public string PersonSex { get; set; } public decimal PersonScore { get; set; } public List<Book> Books { get; set; } }
2.创建Context
public class PersonContext:DbContext { //连接字符串 static string connection = "Data Source=10.1.28.79;Initial Catalog=EntityFrameworkTest;User ID=sa;Password=lizhongchao"; public PersonContext() : base(connection) { } //属性 public DbSet<Person> Person { get; set; } public DbSet<Book> Book { get; set; } public DbSet<Order> Order { get; set; } public DbSet<OrderDetails> OrderDetails{get;set;} protected override void OnModelCreating(DbModelBuilder modelBuilder) { //加载流配置 modelBuilder.Configurations.Add(new PersonConfiguration()); modelBuilder.Configurations.Add(new BookConfiguration()); modelBuilder.Configurations.Add(new OrderConfiguration()); modelBuilder.Configurations.Add(new OrderDetailConfiguration()); base.OnModelCreating(modelBuilder); } }
3.FluentConfig 流配置
public class BookConfiguration : EntityTypeConfiguration<Book> { public BookConfiguration() { this.ToTable("T_Book"); this.HasKey(r => r.BookID); this.Property(r => r.BookID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); this.Property(r => r.BookName).IsRequired().HasMaxLength(20); this.Property(r => r.RowVersion).HasColumnType("RowVersion"); this.Property(r => r.RowVersion).IsConcurrencyToken(true); //定义1对1的强外键的关系 this.HasRequired(r => r.Owner); } } public class OrderConfiguration:EntityTypeConfiguration<Order> { public OrderConfiguration() { this.HasKey(r => r.OrderID); } } public class OrderDetailConfiguration:EntityTypeConfiguration<OrderDetails> { public OrderDetailConfiguration() { this.HasKey(r => r.OrderDetail); this.Property(r => r.OrderDetail).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); //配置多对1的关系,使用现有数据库中的列作为外键,而不是由系统自由生成,该情形适用于已经有了老数据库的情况 //强制外键不允许为空 // this.HasRequired(r => r.Order).WithMany(r => r.OrderDetails).HasForeignKey(r => r.FK_OrderDetail_Order); //外键允许为空 this.HasOptional(r => r.Order).WithMany(r => r.OrderDetails).HasForeignKey(r => r.FK_OrderDetail_Order); } } public class PersonConfiguration : EntityTypeConfiguration<Person> { public PersonConfiguration() { //映射到表名称 this.ToTable("Person"); //设置主键 this.HasKey(p=>p.PersonID); //设置主键的自动生成策略 this.Property(p => p.PersonID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); //设置字段对应的列名称 this.Property(p => p.PersonID).HasColumnName("PK_Person"); //设置字段是非空,以及长度 this.Property(p => p.PersonName).HasColumnName("P_Name").IsRequired().HasMaxLength(20); this.Property(p => p.PersonSex).HasColumnName("P_Sex").IsRequired().HasMaxLength(20); //设置映射到数据库列对应的 数据类型 this.Property(p => p.Version).IsConcurrencyToken(true).HasColumnType("RowVersion"); //设置小数对应的精度(10,2)两位小数10位整数 this.Property(p => p.PersonScore).IsRequired().HasPrecision(10, 2); } }
4.客户端
初始化时对数据库进行schema操作 //设置如果poco与数据库的架构不一致怎么操作数据库 Database.SetInitializer( new DropCreateDatabaseIfModelChanges<PersonContext>()); private void InsertPerson() { using (PersonContext context = new PersonContext()) { Person p = new Person(); p.PersonName = "lizhch"; p.PersonSex = "男"; p.PersonScore = 10.023M; context.Person.Add(p); context.SaveChanges(); } } private static void UpdatePerson() { using (PersonContext context = new PersonContext()) { //查询第一个 var person = context.Person.FirstOrDefault(); person.PersonName = "李仲超" + Guid.NewGuid().ToString().Substring(0, 10); context.SaveChanges(); } } private static void InsertBook() { using (PersonContext context = new PersonContext()) { Person p = context.Person.FirstOrDefault(); Book b = new Book(); b.BookName = "数学"; b.Owner = p; context.Book.Add(b); context.SaveChanges(); } } private void button5_Click(object sender, EventArgs e) { OrderDetails orderDetails = new OrderDetails(); orderDetails.OrderDetail = -1; orderDetails.ProductName = "长城C30"; Order order = new Order() { OrderID = Guid.NewGuid().ToString().Substring(0, 10), OrderName = "C30" }; orderDetails.Order = order; order.OrderDetails = new List<OrderDetails>() { orderDetails }; using (PersonContext context = new PersonContext()) { context.OrderDetails.Add(orderDetails); context.Order.Add(order); context.SaveChanges(); } }
5.总结
/** * 1.配置一对多的关系:A方引用B方的一个引用,B方引用A方的一个集合 * 2.配置多对1的关系:A方引用B方的一个集合,B方引用A方的一个引用 * 3.配置多对多的关系:A方引用B方的一个集合,B方引用A方的一个集合 * 4.配置外键不允许为空、设置1对多的关系 * this.HasRequired(r => r.Order).WithMany(r => r.OrderDetails).HasForeignKey(r => r.FK_OrderDetail_Order); * 5.配置外键运维为空、设置0.1对多的关系 * this.HasOptional(r => r.Order).WithMany(r => r.OrderDetails).HasForeignKey(r => r.FK_OrderDetail_Order); * 6.配置多对一的关系 * this.HasMany(r => r.OrderDetails).WithOptional(r => r.Order); **/