复杂点的使用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_Data\Database1.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怎能没有呢

ServiceStack.OrmLite 笔记9 -code first 必须的代码优先的更多相关文章

  1. ServiceStack.OrmLite 笔记2 -增

    ServiceStack.OrmLite 笔记2 这篇主要介绍 增加 db.Insert(new Employee { Id = 1, Name = "Employee 1" }) ...

  2. ServiceStack.OrmLite 笔记

    ServiceStack.OrmLite 笔记1 ServiceStack.OrmLite 这个东东就是个orm框架,可以实现类似ef的效果.具体的就不这里班门弄斧了. 支持 SqlServerDia ...

  3. ServiceStack.OrmLite 笔记8 -还是有用的姿势

    复杂点的使用2 InsertAll, UpdateAll and DeleteAll 的参数要是IEnumerables Each关键字 返回 IEnumerable 并且是延迟加载的 全局设置 当字 ...

  4. ServiceStack.OrmLite 笔记10-group having 分页orderby等

    group having 分页等 var ev = OrmLiteConfig.DialectProvider.SqlExpression(); group的使用 同sql一样,注意group分组的字 ...

  5. ServiceStack.OrmLite 笔记5 改

    修改 db.Update(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age ...

  6. ServiceStack.OrmLite 笔记4 删

    删除 db.DeleteAll(); //各种姿势 db.Delete(p => p.Age == 27);// db.Delete(q => q.Where(p => p.Age ...

  7. ServiceStack.OrmLite 学习笔记7-复杂点的使用1

    复杂点的使用1 先看看这2个类 class Customer { public int Id { get; set; } ... } class CustomerAddress { public in ...

  8. ServiceStack.OrmLite中的一些"陷阱"(2)

    注:此系列不是说ServiceStack.OrmLite的多个陷阱,这仅仅个人认为是某一个陷阱(毕竟我踩坑了)而引发的思考. 前文说到了项目需要使用两种不同的数据库语言,虽说前文问题已基本解决了,但是 ...

  9. ServiceStack.OrmLite中的一些"陷阱"(1)

    使用过ServiceStack.Ormlite的人都应该知道,其作为一个轻量级的ORM,使用的便捷度非常高,用起来就一个字:爽!而支撑其便捷度的,是库内大量地使用了扩展方法及静态变量. 首先先从源头入 ...

随机推荐

  1. 使用git和github托管个人项目

    1.  安装 cygwin 和 cygwin 下的 git , 测试 git 命令可用;   参考: https://cygwin.com/install.html 2.  注册 github 账号: ...

  2. Web前端开发工程师面试题

    Web前端开发工程师面试题1.说说css的优先级?2.在移动端中,常常使用tap作为点击事件,好处是?会带来什么问题?3.原生JS的window,onload与Jquery的$(document).r ...

  3. 对EJB返回的AaaryList显示到table的处理方法

      1. ArrayList --> Object[]        ArrayList x = new ArrayList();        int i = x.size();        ...

  4. 今天 同一个Nav 左右button 替换不显示的问题 viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序

    viewWillAppear:  Called when the view is about to made visible. Default does nothing视图即将可见时调用.默认情况下不 ...

  5. C#:文件、路径(Path_File)

    public class Path_File { public string AppPath { get { return AppDomain.CurrentDomain.BaseDirectory; ...

  6. ecshop增加pc扫描二维码微信支付功能代码

    ecshop开发网站,如果没有手机版,又想通过微信支付,可以加入pc二维码扫描微信支付功能 工具/原料 ecshop商城系统,phpqrcode,WxPayPubHelper 公众号已申请微信支付 方 ...

  7. python7 静态方法、类方法、属性方法 ;反射;异常处理

      #-*- coding:utf8 -*- # 静态方法@staticmethod # 静态方法(当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了.) clas ...

  8. SQL中join的用法

    关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create table table1(id int ...

  9. 【转】JS 和 java 交互

    android中如何获得webView中的内容发表于 2011 年 06 月 13 日 由 admin本文概要:在程序中经常会用到webView来显示网页,但如果能够得到网页中的内容呢,本文将给你一个 ...

  10. c# 客户端

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...