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怎能没有呢

  • 相关阅读:
    Billing Invoice Split Rule
    From ProjectMagazine
    Link to PMP
    测试发现数据库性能问题后的SQL调优
    被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
    解决'将 expression 转换为数据类型 nvarchar 时出现算术溢出错误。'
    几年来ASP.NET官方站点首次改版,意味着MVC时代全面到来?
    Collection was modified; enumeration operation may not execute.的异常处理
    解决Sandcastle Help File Builder报错问题
    如何查看Windows服务所对应的端口?
  • 原文地址:https://www.cnblogs.com/wang2650/p/5145662.html
Copyright © 2011-2022 走看看