• Entity framework 学习


    View Code
    publicclass MyDomainContext : DbContext 
    { 
        public DbSet<Order> Orders { get; set; } 
        public DbSet<OrderDetail> OrderDetails { get; set; } 
    
        static MyDomainContext() 
        { 
            Database.SetInitializer<MyDomainContext>(
               new DropCreateDatabaseIfModelChanges<MyDomainContext>()); 
        } 
    }

    2.覆盖默认约定 Override Default Naming Convention

      1.The model-blocking Builder 

        rewrite the OnModelCreating

        

    View Code
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        base.OnModelCreating(modelBuilder); 
        //    Map schemas 
        modelBuilder.Entity<Order>().ToTable("efdemo.Order"); 
    } 

        API

        

    View Code
    modelBuilder.Entity<Order>().Property(x => x.OrderID) 
                    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
                    .IsRequired() 
                    .HasColumnName("TheOrderID");

        rewrite default naming convention

        

    View Code
    //    Map schemas 
    modelBuilder.Entity<Order>().ToTable("efdemo.Order"); 
    //    Identity Column 
    modelBuilder.Entity<Order>().Property(x => x.OrderID) 
                    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
    //    String columns 
    modelBuilder.Entity<Order>().Property(x => x.OrderTitle) 
                    .IsRequired() 
                    .HasMaxLength(64); 
    modelBuilder.Entity<Order>().Property(x => x.CustomerName) 
                    .IsRequired() 
                    .HasMaxLength(32); 
    //    Date Columns 
    modelBuilder.Entity<Order>().Property(x => x.TransactionDate) 
                    .IsRequired();

      2.Increase  the model of the label

      

    View Code
    public class Order 
    { 
      [Key] 
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
      public int OrderNumber { get; set; } 
        … 
    }

    3.Greedy load and Lazy load

      

    View Code
    var orders = from o in context.Orders.Include("OrderDetails").Include("Businesses") 
                 where o.CustomerName == "Mac" 
                 select o; 
    View Code
    public class Order 
    { 
        public int OrderID { get; set; } 
        public string OrderTitle { get; set; } 
        public string CustomerName { get; set; } 
        public DateTime TransactionDate { get; set; } 
        public virtual List<OrderDetail> OrderDetails { get; set; } 
        public virtual List<Business> Businesses { get; set; } 
    } 

    4. Complex Type

    1.
    publicclass Client 
    { 
        publicint ClientID { get; set; } 
        [Required] 
        [StringLength(32, MinimumLength=2)] 
        publicstring ClientName { get; set; } 
        public Address ResidentialAddress { get; set; } 
        public Address DeliveryAddress { get; set; } 
    } 
    
    publicclass Address 
    { 
        [Required] 
        publicint StreetNumber { get; set; } 
        [Required] 
        [StringLength(32, MinimumLength=2)] 
        publicstring StreetName { get; set; } 
    }
    
    2.
    
    protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        base.OnModelCreating(modelBuilder); 
    
        modelBuilder.Entity<Client>().Property(x => x.ClientID) 
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
        modelBuilder.ComplexType<Address>(); 
        modelBuilder.Entity<Client>().Property(i => i.ResidentialAddress.StreetNumber).HasColumnName("ResStreetNumber"); 
        modelBuilder.Entity<Client>().Property(i => i.ResidentialAddress.StreetName).HasColumnName("ResStreetName"); 
        modelBuilder.Entity<Client>().Property(i => i.DeliveryAddress.StreetNumber).HasColumnName("DelStreetNumber"); 
        modelBuilder.Entity<Client>().Property(i => i.DeliveryAddress.StreetName).HasColumnName("DelStreetName"); 
    
    }
    
    
    3.
    
    using (var context1 =new MyDomainContext()) 
        { 
            var client =new Client 
            { 
                ClientName ="Joe", 
                ResidentialAddress =new Address 
                { 
                    StreetNumber =15, 
                    StreetName ="Oxford" 
                }, 
                DeliveryAddress =new Address 
                { 
                    StreetNumber =514, 
                    StreetName ="Nolif" 
                } 
            }; 
            context1.Clients.Add(client); 
    
            context1.SaveChanges(); 
        } 
        using (var context2 =new MyDomainContext()) 
        { 
            var clients = from w in context2.Clients 
                          where w.ClientName =="Joe" 
                          select w; 
    
            foreach (var client in clients) 
            { 
                Console.WriteLine("client residential StreetNumber:  "+ client.ResidentialAddress.StreetNumber); 
                Console.WriteLine("client residential StreetName:  "+ client.ResidentialAddress.StreetName); 
                Console.WriteLine("client delivery StreetNumber:  "+ client.DeliveryAddress.StreetNumber); 
                Console.WriteLine("client delivery StreetName:  "+ client.DeliveryAddress.StreetName); 
            } 
        }

      Even if all the properties of the complex type is nullable,  the entire complex type objects cannot be set to NULL.

    5. many-to-many relationship

      

    publicclass Order 
    { 
        public int OrderID { get; set; } 
        [Required] 
        [StringLength(32, MinimumLength =2)] 
        public string OrderTitle { get; set; } 
        [Required] 
        [StringLength(64, MinimumLength=5)] 
        public string CustomerName { get; set; } 
        public DateTime TransactionDate { get; set; } 
        public byte[] TimeStamp { get; set; } 
    
        public virtual List<OrderDetail> OrderDetails { get; set; } 
        public virtual List<Employee> InvolvedEmployees { get; set; } 
    } 
    
    publicclass Employee 
    { 
        public int EmployeeID { get; set; } 
        public string EmployeeName { get; set; } 
    
        public virtual List<Order> Orders { get; set; } 
    }

    modelBuilder.Entity<Employee>() 
        .HasMany(e => e.Orders) 
        .WithMany(e => e.InvolvedEmployees) 
        .Map(m => 
        { 
            m.ToTable("EmployeeOrder"); 
            m.MapLeftKey("EmployeeID"); 
            m.MapRightKey("OrderID"); 
        });
    privatestaticvoid ManyToMany() 
    { 
        using (var context =new MyDomainContext()) 
        { 
            var order =new Order 
            { 
                OrderTitle ="Pens", 
                CustomerName ="Mcdo’s", 
                TransactionDate = DateTime.Now, 
                InvolvedEmployees =new List<Employee>() 
            }; 
            var employee1 =new Employee { EmployeeName ="Joe", Orders =new List<Order>() }; 
            var employee2 =new Employee { EmployeeName ="Black", Orders =new List<Order>() }; 
    
            context.Orders.Add(order); 
    
            order.InvolvedEmployees.Add(employee1); 
            order.InvolvedEmployees.Add(employee2); 
    
            context.SaveChanges(); 
        }

    6. Optimistic Concurrency

    public class Order 
    { 
        public int OrderID { get; set; } 
        [Required] 
        [StringLength(32, MinimumLength = 2)] 
        public string OrderTitle { get; set; } 
        [Required] 
        [StringLength(64, MinimumLength=5)] 
        public string CustomerName { get; set; } 
        public DateTime TransactionDate { get; set; } 
        [ConcurrencyCheck] 
        [Timestamp] 
        public byte[] TimeStamp { get; set; } 
    
        public virtual List<OrderDetail> OrderDetails { get; set; } 
        public virtual List<Employee> InvolvedEmployees { get; set; } 
    }
    private static void ConcurrencyCheck() 
    { 
        Order originalOrder; 
    
        //    Create an order 
        using (var context1 = new MyDomainContext()) 
        { 
            originalOrder = new Order 
            { 
                OrderTitle = "Paper", 
                CustomerName = "*Bob*", 
                TransactionDate = DateTime.Now 
            }; 
    
            context1.Orders.Add(originalOrder); 
            context1.SaveChanges(); 
        } 
        //    Simulate the modification of the created order by user X 
        using (var context2 = new MyDomainContext()) 
        {    //    Recreate the order object in order to attach it 
            var order = new Order 
            { 
                OrderID = originalOrder.OrderID, 
                OrderTitle = originalOrder.OrderTitle, 
                CustomerName = originalOrder.CustomerName, 
                TransactionDate = originalOrder.TransactionDate, 
                TimeStamp = originalOrder.TimeStamp 
            }; 
    
            context2.Orders.Attach(order); 
    
            //    Alter the order 
            order.CustomerName = "Robert"; 
    
            context2.SaveChanges(); 
        } 
        //    Simulate the modification of the created order by user Y (after user X already modified it) 
        using (var context3 = new MyDomainContext()) 
        {    //    Recreate the order in order to attach it 
            var order = new Order 
            { 
                OrderID = originalOrder.OrderID, 
                OrderTitle = originalOrder.OrderTitle, 
                CustomerName = originalOrder.CustomerName, 
                TransactionDate = originalOrder.TransactionDate, 
                TimeStamp = originalOrder.TimeStamp 
            }; 
    
            context3.Orders.Attach(order); 
    
            //    Alter the order 
            order.CustomerName = "Luke**"; 
    
            try 
            { 
                context3.SaveChanges(); 
            } 
            catch (DbUpdateConcurrencyException ex) 
            { 
                Console.WriteLine("Concurrency exception on " + ex.Entries.First().Entity.GetType().Name); 
            } 
        } 
    }

    You can also force the EF believe that the order has been modified

    context3.Entry(order).State = EntityState.Modified; 

    7.Inheritance

  • 相关阅读:
    使用Beetle实现http代理服务
    Socket Tcp服务吞吐测试工具
    实现高性能稳定的socket tcp通讯经验分享
    Silverlight自定义按钮模板
    值得研究的 工作流 开源项目
    值得研究的 开源数据库
    值得研究的 创建PDF 组件
    值得研究的 开源图形引擎
    通用的NTier模型合理么?
    值得研究的 RSS阅读器
  • 原文地址:https://www.cnblogs.com/ruanyifeng/p/2824680.html
Copyright © 2020-2023  润新知