zoukankan      html  css  js  c++  java
  • ServiceStack.OrmLite 笔记9 -code first 必须的代码优先

    复杂点的使用3


    code first的使用,支持复杂类型
    public enum PhoneType {
    Home,
    Work,
    Mobile,
    }

    public enum AddressType {
    Home,
    Work,
    Other,
    }

    public class Address {
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string ZipCode { get; set; }
    public string State { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
    }

    public class Customer {
    public Customer() {
    this.PhoneNumbers = new Dictionary<PhoneType, string>();
    this.Addresses = new Dictionary<AddressType, Address>();
    }

    [AutoIncrement] // 创建自增长主键
    public int Id { get; set; }
    
    public string FirstName { get; set; }
    public string LastName { get; set; }
    
    [Index(Unique = true)] // 创建索引
    public string Email { get; set; }
    
    public Dictionary<PhoneType, string> PhoneNumbers { get; set; }  //Blobbed
    public Dictionary<AddressType, Address> Addresses { get; set; }  //Blobbed
    public DateTime CreatedAt { get; set; }
    

    }

    public class Order {

    [AutoIncrement]
    public int Id { get; set; }
    
    [References(typeof(Customer))]      //外键
    public int CustomerId { get; set; }
    
    [References(typeof(Employee))]      //Creates Foreign Key
    public int EmployeeId { get; set; }
    
    public Address ShippingAddress { get; set; } //Blobbed (no Address table)
    
    public DateTime? OrderDate { get; set; }
    public DateTime? RequiredDate { get; set; }
    public DateTime? ShippedDate { get; set; }
    public int? ShipVia { get; set; }
    public decimal Freight { get; set; }
    public decimal Total { get; set; }
    

    }

    public class OrderDetail {

    [AutoIncrement]
    public int Id { get; set; }
    
    [References(typeof(Order))] //Creates Foreign Key
    public int OrderId { get; set; }
    
    public int ProductId { get; set; }
    public decimal UnitPrice { get; set; }
    public short Quantity { get; set; }
    public decimal Discount { get; set; }
    

    }

    public class Employee {
    public int Id { get; set; }
    public string Name { get; set; }
    }

    public class Product {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal UnitPrice { get; set; }
    }

    //Setup SQL Server Connection Factory
    var dbFactory = new OrmLiteConnectionFactory(
    @"Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|App_DataDatabase1.mdf;Integrated Security=True;User Instance=True",
    SqlServerDialect.Provider);

    //Use in-memory Sqlite DB instead
    //var dbFactory = new OrmLiteConnectionFactory(
    // ":memory:", false, SqliteDialect.Provider);

    //Non-intrusive: All extension methods hang off System.Data.* interfaces
    using (IDbConnection db = Config.OpenDbConnection())
    {
    //Re-Create all table schemas:
    db.DropTable();
    db.DropTable();
    db.DropTable();
    db.DropTable();
    db.DropTable();

    db.CreateTable();
    db.CreateTable();
    db.CreateTable();
    db.CreateTable();
    db.CreateTable();

    db.Insert(new Employee { Id = 1, Name = "Employee 1" });
    db.Insert(new Employee { Id = 2, Name = "Employee 2" });
    var product1 = new Product { Id = 1, Name = "Product 1", UnitPrice = 10 };
    var product2 = new Product { Id = 2, Name = "Product 2", UnitPrice = 20 };
    db.Save(product1, product2);

    var customer = new Customer {
    FirstName = "Orm",
    LastName = "Lite",
    Email = "ormlite@servicestack.net",
    PhoneNumbers =
    {
    { PhoneType.Home, "555-1234" },
    { PhoneType.Work, "1-800-1234" },
    { PhoneType.Mobile, "818-123-4567" },
    },
    Addresses =
    {
    { AddressType.Work, new Address {
    Line1 = "1 Street", Country = "US", State = "NY", City = "New York", ZipCode = "10101" }
    },
    },
    CreatedAt = DateTime.UtcNow,
    };

    var customerId = db.Insert(customer, selectIdentity: true); //Get Auto Inserted Id
    customer = db.Single(new { customer.Email }); //Query
    Assert.That(customer.Id, Is.EqualTo(customerId));

    //Direct access to System.Data.Transactions:
    using (IDbTransaction trans = db.OpenTransaction(IsolationLevel.ReadCommitted))
    {
    var order = new Order {
    CustomerId = customer.Id,
    EmployeeId = 1,
    OrderDate = DateTime.UtcNow,
    Freight = 10.50m,
    ShippingAddress = new Address {
    Line1 = "3 Street", Country = "US", State = "NY", City = "New York", ZipCode = "12121" },
    };
    db.Save(order); //Inserts 1st time

      //order.Id populated on Save().
    
      var orderDetails = new[] {
          new OrderDetail {
              OrderId = order.Id,
              ProductId = product1.Id,
              Quantity = 2,
              UnitPrice = product1.UnitPrice,
          },
          new OrderDetail {
              OrderId = order.Id,
              ProductId = product2.Id,
              Quantity = 2,
              UnitPrice = product2.UnitPrice,
              Discount = .15m,
          }
      };
    
      db.Save(orderDetails);
    
      order.Total = orderDetails.Sum(x => x.UnitPrice * x.Quantity * x.Discount) + order.Freight;
    
      db.Save(order); //Updates 2nd Time
    
      trans.Commit();
    

    }
    }
    [Ignore] 可以忽略某个属性

    ![此处输入图片的描述][1]

    [Alias("Shippers")]
    public class Shipper
    : IHasId
    {
    [AutoIncrement]
    [Alias("ShipperID")]
    public int Id { get; set; }

    [Required]//是否必须
    [Index(Unique = true)]//索引
    [StringLength(40)]//长度
    public string CompanyName { get; set; }
    
    [StringLength(24)]
    public string Phone { get; set; }
    
    [References(typeof(ShipperType))]
    public int ShipperTypeId { get; set; }
    

    }
    这个基本就够用了 codefirst啊
    [Alias("ShipperTypes")]
    public class ShipperType
    : IHasId
    {
    [AutoIncrement]
    [Alias("ShipperTypeID")]
    public int Id { get; set; }

    [Required]
    [Index(Unique = true)]
    [StringLength(40)]
    public string Name { get; set; }
    

    }

    public class SubsetOfShipper
    {
    public int ShipperId { get; set; }
    public string CompanyName { get; set; }
    }

    public class ShipperTypeCount
    {
    public int ShipperTypeId { get; set; }
    public int Total { get; set; }
    }

    [Alias("UserAuth")]//别名
    [CompositeIndex(true, "CompanyId", "UserName")]//复合索引
    public class MyCustomUserAuth
    {
        [AutoIncrement]
        public int Id { get; set; }
    
        [References(typeof(Company))]
        public int CompanyId { get; set; }
    
        public string UserName { get; set; }
    
        public string Email { get; set; }
    }
    

    事务的支持

    var trainsType = new ShipperType { Name = "Trains" };
    var planesType = new ShipperType { Name = "Planes" };

    //Playing with transactions
    using (IDbTransaction dbTrans = db.OpenTransaction())
    {
    db.Save(trainsType);
    db.Save(planesType);

      dbTrans.Commit();
    

    }

    using (IDbTransaction dbTrans = db.OpenTransaction(IsolationLevel.ReadCommitted))
    {
    db.Insert(new ShipperType { Name = "Automobiles" });
    Assert.That(db.Select(), Has.Count.EqualTo(3));
    }
    Assert.That(db.Select(), Has.Count(2));

    修改表名

    dbConn.GetDialectProvider().GetQuotedTableName(modelType.GetModelDefinition())// 获取表名(根据类获取表名)
    

    //oldtableName 因为老表已经不存在了(即老表对应的那个类),所以只能老表名用字符串
    public static void AlterTable(this IDbConnection dbConn, Type modelType, string command)
    {

    var person = db.SqlScalar("exec sp_name @OLDtablename, @newtablename", new { OLDtablename= "oldtableName", tablename= dbConn.GetDialectProvider().GetQuotedTableName(modelType.GetModelDefinition()) });
    }

    添加列
    db.AddColumn(t => t.tim);
    修改列名
    db.ChangeColumnName(t => t.tim,"ss");
    修改列
    db.AlterColumn(t => t.tim);
    删除列
    db.DropColumn("columnName"); //Type LetterWeighting, string columnName

    删除外键
    db.DropForeignKey("ForeignKeyName"); //

    添加外键
    public enum OnFkOption
    {
    Cascade,
    SetNull,
    NoAction,
    SetDefault,
    Restrict
    }
    dbConnection.AddForeignKey<TypeWithNoForeignKeyInitially, ReferencedType>( t => t.RefId, tr => tr.Id, OnFkOption.NoAction, OnFkOption.Cascade, "FK_ADDED");

    // 删除索引
    db.DropIndex("IndexName"); //
    //添加索引

    db.CreateIndex(t => t.tim, "ss",false); // 字段,索引名 ,是否唯一索引
    // 多列索引 源代码只支持在一个列上创建索引 可以加入新的扩展方法
    在OrmLiteSchemaModifyApi.cs中 加入新方法

    public static void CreateIndex<T>(this IDbConnection dbConn, string fields,
                                      string indexName = null, bool unique = false)
    {
        var sourceMD = ModelDefinition<T>.Definition;
        string name = indexName.IsNullOrEmpty() ?
                                    (unique ? "uidx" : "idx") + "_" + sourceMD.ModelName + "_" + fields.Replace(",", "").Trim() :
                                    indexName;
        string command = string.Format("CREATE{0}INDEX {1} ON {2}({3});",
                                       unique ? " UNIQUE " : " ",
                                       name,
                                       sourceMD.ModelName,
                                       fields);
        dbConn.ExecuteSql(command);
    }
    

    使用
    为LetterWeighting的两个列创建非聚集索引
    List listField = new List();
    var sourceMD = ModelDefinition.Definition;
    listField.Add(sourceMD.GetFieldDefinition(t => t.Weighting).FieldName);
    listField.Add(sourceMD.GetFieldDefinition(t => t.tim).FieldName);
    db.CreateIndex(string.Join(",", listField.ToArray()), "ss", false);

    //建议 最好动手实践下. 如果没有你需要的codefirst代码(比如如果创建索引).建议通过先在数据库里设置好(创建索引),然后通过t4模板生成,看看是否有你需要的代码(创建索引的代码)

    硬货随后奉上 group having怎能没有呢

  • 相关阅读:
    How to install VXDIAG Honda, Toyota and JLR SDD software
    16% off MPPS V16 ECU tuning tool for EDC15 EDC16 EDC17
    Cummins INSITE locked and ask for verification code
    How to use BMW Multi Tool 7.3 to replace lost key for BMW X1
    Bleed Brake Master Cylinder with Intelligent Tester IT2
    Porsche Piwis Tester II “No VCI has been detected”,how to do?
    Creader VIII VS. Creader VII+
    How to solve GM MDI cannot complete the installation
    汽车OBD2诊断程序开发 (原文转载,思路很清晰!)
    汽车节温器单片机开发思路
  • 原文地址:https://www.cnblogs.com/wang2650/p/5145662.html
Copyright © 2011-2022 走看看