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);
         **/

 

posted @ 2013-10-30 18:00  feidaochuanqing  阅读(280)  评论(0编辑  收藏  举报