复杂点的使用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. 【python cookbook】【字符串与文本】1.针对任意多的分隔符拆分字符串

    问题:将分隔符(以及分隔符之间的空格)不一致的字符串拆分为不同的字段: 解决方案:使用更为灵活的re.split()方法,该方法可以为分隔符指定多个模式. 说明:字符串对象的split()只能处理简单 ...

  2. paste DEMO合并文件

    测试数据: [xiluhua@vm-xiluhua][~]$ cat msn.txt aaa bbb bbb ccc ccc ddd bbb eee aaa ccc bbb sss [xiluhua@ ...

  3. React Native微信分享 朋友圈分享 Android/iOS 通用

    超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用   2016/06/16 |  React Native技术文章 |  Sky丶清|  暂无评论 |  1 ...

  4. 事务的隔离级别及mysql对应操作

    /* 本次高并发解决之道 1,更改事务隔离级别为 read uncommitted读未提交 2,查询前设定延迟,延迟时间为随机 50-500 微秒 3,修改数据前将 超范围作为 限定修改条件 事务是作 ...

  5. js笔记---拖动元素

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. ASP.net 上传

    if (FileUpload1.HasFile) { string filename = FileUpload1.PostedFile.FileName; string dir_file = &quo ...

  7. 周赛-Killing Monsters 分类: 比赛 2015-08-02 09:45 3人阅读 评论(0) 收藏

    Killing Monsters Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...

  8. Unity-Animator深入系列---状态机面板深入

    回到 Animator深入系列总目录 本篇不讲解所有的面板功能,只是针对一些非常用功能进行介绍. 1.状态 1.1状态简介 简单的不做介绍了,需要特别注意: 1.Paramter勾选后可以指定参数控制 ...

  9. python INFO: Can't locate Tcl/Tk libs and/or headers

    安装opencv的时候遇到这个错误: python INFO: Can't locate Tcl/Tk libs and/or headers 参考如下文章解决这个问题: http://www.ver ...

  10. web简单连接html文件测试

    Web工程: 条件: apache-tomcat-6.0.20(文件夹/7.0)=======位于E盘 标题:链接服务器 步骤: 第一步:打开apache-tomcat-6.0.20-bin-star ...