本文将演示如何通过 Entity Framework 数据模型创建、修改、删除数据库记录。
插入
为了在数据库里创建新纪录,需要创建相应实体类的新实例,填充字段,把实体类加入 ObjectContext 派生类维护的 EntityCollection,然后调用 SaveChanges()写入新纪录:
Customer cust = new Customer()
{
CustomerID = "LAWN",
CompanyName = "Lawn Wranglers",
ContactName = "Mr. Abe Henry",
ContactTitle = "Owner",
Address = "1017 Maple Leaf Way",
City = "Ft. Worth",
Region = "TX",
PostalCode = "76104",
Country = "USA",
Phone = "(800) MOW-LAWN",
Fax = "(800) MOW-LAWO"
};
NorthwindEntities db = new NorthwindEntities();
db.Customers.AddObject(cust);
db.SaveChanges();
可以多次 AddObject()后调用一次 SaveChanges() 全部写入数据库。
1. 创建部分加载的实体类
在之前的示例里,我们调用了 Customer 实体类的默认构造函数,它创建的实例没有加载任何数据。不过,我们还可以通过在构造函数里指定必须字段的值来减少数据库错误的风险。
每个实体类都有一个名为 CreateT 的工厂方法,例如,Customer 的实体类的工厂方法是 CreateCustomer 。看下面示例:
Customer cust = Customer.CreateCustomer("LAWN", "Lawn Wranglers");
cust.ContactName = "Mr. Abe Henry";
cust.ContactTitle = "Owner";
cust.Address = "1017 Maple Leaf Way";
cust.City = "Ft. Worth";
cust.Region = "TX";
cust.PostalCode = "76104";
cust.Country = "USA";
cust.Phone = "(800) MOW-LAWN";
cust.Fax = "(800) MOW-LAWO";
NorthwindEntities db = new NorthwindEntities();
db.Customers.AddObject(cust);
db.SaveChanges();
我们倾向于使用默认构造函数,因为可以在一条语句里指定属性的值,但是如果你经常会忘记给必需的字段赋值,那么工厂方法对你就非常有用。
2. 插入关联的实体
可以用实体类的导航属性创建一组关联的对象,然后一次把它们存储到数据库:
Customer cust = new Customer
{
CustomerID = "LAWN",
CompanyName = "Lawn Wranglers",
ContactName = "Mr. Abe Henry",
ContactTitle = "Owner",
Address = "1017 Maple Leaf Way",
City = "Ft. Worth",
Region = "TX",
PostalCode = "76104",
Country = "USA",
Phone = "(800) MOW-LAWN",
Fax = "(800) MOW-LAWO",
Orders = {
new Order{
CustomerID = "LAWN",
EmployeeID = 4,
OrderDate = DateTime.Now,
RequiredDate = DateTime.Now.AddDays(7),
ShipVia = 3,
Freight = new Decimal(24.66),
ShipName = "Lawn Wranglers",
ShipAddress = "1017 Maple Leaf Way",
ShipCity = "Ft. Worth",
ShipRegion = "TX",
ShipPostalCode = "76104",
ShipCountry = "USA"
}
}
};
NorthwindEntities db = new NorthwindEntities();
db.Customers.AddObject(cust);
db.SaveChanges();
如果单独创建 Order 和 Customer 对象,就不得不显式的添加 Order:
Customer cust = new Customer
{
CustomerID = "LAWN",
CompanyName = "Lawn Wranglers",
ContactName = "Mr. Abe Henry",
ContactTitle = "Owner",
Address = "1017 Maple Leaf Way",
City = "Ft. Worth",
Region = "TX",
PostalCode = "76104",
Country = "USA",
Phone = "(800) MOW-LAWN",
Fax = "(800) MOW-LAWO",
};
Order ord = new Order
{
CustomerID = "LAWN",
EmployeeID = 4,
OrderDate = DateTime.Now,
RequiredDate = DateTime.Now.AddDays(7),
ShipVia = 3,
Freight = new Decimal(24.66),
ShipName = "Lawn Wranglers",
ShipAddress = "1017 Maple Leaf Way",
ShipCity = "Ft. Worth",
ShipRegion = "TX",
ShipPostalCode = "76104",
ShipCountry = "USA"
};
NorthwindEntities db = new NorthwindEntities();
db.Customers.AddObject(cust);
db.Orders.AddObject(ord);
db.SaveChanges();
更新
更新实体类和修改对象的属性一样简单:
NorthwindEntities db = new NorthwindEntities();
Customer cust = (from c in db.Customers
where c.CustomerID == "LAWN"
select c).Single();
cust.ContactName = "John Smith";
cust.Fax = "(800) 123 1234";
db.SaveChanges();
Single():返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。
删除
删除也很简单:
NorthwindEntities db = new NorthwindEntities();
IEnumerable<Order_Detail> ods = from o in db.Order_Details
where o.OrderID == 10248
select o;
// 对 LINQ 查询而返回的结果集进行处理
// 要么使用 Single() 取出单条记录
// 要么就迭代集合进行处理
foreach (Order_Detail o in ods)
{
db.Order_Details.DeleteObject(o);
}