如何:使用静态 Create 方法创建对象(实体框架)
实体框架 工具使用概念性架构定义语言 (CSDL) 文件以生成用于定义对象层的代码。当生成数据类时,将使用静态 create 工厂方法生成每个类。此方法用于实例化对象并设置此类的不能为空的所有属性。此方法对于在 CSDL 文件中已应用 Nullable="false" 属性 (Attribute) 的每个属性 (Property) 都具有一个参数。当创建具有许多必需属性的对象时使用此方法。
本主题中的示例基于 Adventure Works 销售模型。若要运行本示例中的代码,必须已将 AdventureWorks 销售模型添加到您的项目中,并将项目配置为使用 Entity Framework。为此,请完成如何:手动配置实体框架项目和如何:手动定义实体数据模型(实体框架) 中的过程。
示例
以下是用于 AdventureWorks 销售模型 (EDM) 中的 SalesOrderHeader 类型的示例 CSDL 段:
<EntityType Name="SalesOrderHeader">
<Key>
<PropertyRef Name="SalesOrderID" />
</Key>
<Property Name="SalesOrderID" Type="Int32" Nullable="false" />
<Property Name="RevisionNumber" Type="Byte" Nullable="false" />
<Property Name="OrderDate" Type="DateTime" Nullable="false" />
<Property Name="DueDate" Type="DateTime" Nullable="false" />
<Property Name="ShipDate" Type="DateTime" />
<Property Name="Status" Type="Byte" Nullable="false" ConcurrencyMode="Fixed" />
<Property Name="OnlineOrderFlag" Type="Boolean" Nullable="false" />
<Property Name="SalesOrderNumber" Type="String" Nullable="false" MaxLength="25" Unicode="true" FixedLength="false" />
<Property Name="PurchaseOrderNumber" Type="String" MaxLength="25" Unicode="true" FixedLength="false" />
<Property Name="AccountNumber" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
<Property Name="CustomerID" Type="Int32" Nullable="false" />
<Property Name="SalesPersonID" Type="Int32" />
<Property Name="TerritoryID" Type="Int32" />
<Property Name="ShipMethodID" Type="Int32" Nullable="false" />
<Property Name="CreditCardID" Type="Int32" />
<Property Name="CreditCardApprovalCode" Type="String" MaxLength="15" Unicode="false" FixedLength="false" />
<Property Name="CurrencyRateID" Type="Int32" />
<Property Name="SubTotal" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="TaxAmt" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="Freight" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="TotalDue" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
<Property Name="Comment" Type="String" MaxLength="128" Unicode="true" FixedLength="false" />
<Property Name="rowguid" Type="Guid" Nullable="false" />
<Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
<NavigationProperty Name="Address" Relationship="AdventureWorksModel.FK_SalesOrderHeader_Address_BillToAddressID" FromRole="SalesOrderHeader" ToRole="Address" />
<NavigationProperty Name="Address1" Relationship="AdventureWorksModel.FK_SalesOrderHeader_Address_ShipToAddressID" FromRole="SalesOrderHeader" ToRole="Address" />
<NavigationProperty Name="Contact" Relationship="AdventureWorksModel.FK_SalesOrderHeader_Contact_ContactID" FromRole="SalesOrderHeader" ToRole="Contact" />
<NavigationProperty Name="SalesOrderDetail" Relationship="AdventureWorksModel.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID" FromRole="SalesOrderHeader" ToRole="SalesOrderDetail" />
</EntityType>
以下是为 AdventureWorks 中的 SalesOrderHeader 类生成的静态 CreateSalesOrderHeader 方法的示例:
Public Shared Function CreateSalesOrderHeader(ByVal salesOrderID As Integer, _
ByVal revisionNumber As Byte, ByVal orderDate As Date, ByVal dueDate As Date, _
ByVal status As Byte, ByVal onlineOrderFlag As Boolean, _
ByVal salesOrderNumber As String, ByVal customerID As Integer, _
ByVal shipMethodID As Integer, ByVal subTotal As Decimal, ByVal taxAmt As Decimal, _
ByVal freight As Decimal, ByVal totalDue As Decimal, ByVal rowguid As Global.System.Guid, _
ByVal modifiedDate As Date) As SalesOrderHeader
Dim salesOrderHeader As SalesOrderHeader = New SalesOrderHeader
salesOrderHeader.SalesOrderID = salesOrderID
salesOrderHeader.RevisionNumber = revisionNumber
salesOrderHeader.OrderDate = orderDate
salesOrderHeader.DueDate = dueDate
salesOrderHeader.Status = status
salesOrderHeader.OnlineOrderFlag = onlineOrderFlag
salesOrderHeader.SalesOrderNumber = salesOrderNumber
salesOrderHeader.CustomerID = customerID
salesOrderHeader.ShipMethodID = shipMethodID
salesOrderHeader.SubTotal = subTotal
salesOrderHeader.TaxAmt = taxAmt
salesOrderHeader.Freight = freight
salesOrderHeader.TotalDue = totalDue
salesOrderHeader.rowguid = rowguid
salesOrderHeader.ModifiedDate = modifiedDate
Return salesOrderHeader
End Function
public static SalesOrderHeader CreateSalesOrderHeader(int salesOrderID,
byte revisionNumber, global::System.DateTime orderDate,
global::System.DateTime dueDate, byte status, bool onlineOrderFlag,
string salesOrderNumber, int customerID, int shipMethodID, decimal subTotal,
decimal taxAmt, decimal freight, decimal totalDue, global::System.Guid rowguid,
global::System.DateTime modifiedDate)
{
SalesOrderHeader salesOrderHeader = new SalesOrderHeader();
salesOrderHeader.SalesOrderID = salesOrderID;
salesOrderHeader.RevisionNumber = revisionNumber;
salesOrderHeader.OrderDate = orderDate;
salesOrderHeader.DueDate = dueDate;
salesOrderHeader.Status = status;
salesOrderHeader.OnlineOrderFlag = onlineOrderFlag;
salesOrderHeader.SalesOrderNumber = salesOrderNumber;
salesOrderHeader.CustomerID = customerID;
salesOrderHeader.ShipMethodID = shipMethodID;
salesOrderHeader.SubTotal = subTotal;
salesOrderHeader.TaxAmt = taxAmt;
salesOrderHeader.Freight = freight;
salesOrderHeader.TotalDue = totalDue;
salesOrderHeader.rowguid = rowguid;
salesOrderHeader.ModifiedDate = modifiedDate;
return salesOrderHeader;
}
以下是有关如何使用静态 CreateSalesOrderHeader 方法以创建和保存 SalesOrderHeader 对象的示例:
Dim productId As Integer = 777 'Mountain-100 Black, 44
Dim quantity As Short = 1
Dim lastName As String = "Adams"
Dim firstName As String = "Frances"
Dim invoiceNumber As String = "PO123456"
Dim shipMethod As Integer = 5
Dim specialOffer As Integer = 1
Using advWorksContext As New AdventureWorksEntities()
Try
' Get the Contact for the specific customer
' and the related address.
Dim customer As Contact = advWorksContext.Contact _
.Include("SalesOrderHeader.Address") _
.Where("it.LastName = @lastname", _
New ObjectParameter("lastname", lastName)) _
.Where("it.FirstName = @firstname", _
New ObjectParameter("firstname", firstName)) _
.First()
' Get the customer's address to use to create
' a new order with the same address.
Dim address As Address = customer.SalesOrderHeader _
.First().Address()
' Get the Product with the requested ID.
Dim product As Product = _
advWorksContext.Product.Where("it.ProductID = @product_id", _
New ObjectParameter("product_id", productId)).First()
' Create a new SalesOrderHeader using the static
' CreateSalesOrderHeader method.
Dim order As SalesOrderHeader = _
SalesOrderHeader.CreateSalesOrderHeader( _
1, Convert.ToByte(1), DateTime.Now, DateTime.Today.AddMonths(2), _
Convert.ToByte(1), False, String.Empty, customer.ContactID, shipMethod, _
0, 0, 0, 0, Guid.NewGuid(), DateTime.Now)
' Set addition order properties.
order.Address = address
order.Address1 = address
order.PurchaseOrderNumber = invoiceNumber
' Create a new SalesOrderDetail using the static
' CreateSalesOrderDetail method.
Dim item As SalesOrderDetail = _
SalesOrderDetail.CreateSalesOrderDetail( _
1, 0, quantity, product.ProductID, specialOffer, product.StandardCost, _
0, 0, Guid.NewGuid(), DateTime.Now)
' Add item to the items collection and
' add order to the orders collection.
order.SalesOrderDetail.Add(item)
customer.SalesOrderHeader.Add(order)
' Call a custom method to recalculate totals.
' For more information, see "Customizing Objects."
order.UpdateOrderTotal()
' Save changes pessimistically. This means that changes
' must be accepted manually once the transaction succeeds.
advWorksContext.SaveChanges()
Console.WriteLine("Order created with order number: " _
+ order.SalesOrderNumber)
Catch ex As Exception
Console.WriteLine(ex.ToString())
End Try
End Using
int productId = 777; //Mountain-100 Black, 44
short quantity = 1;
string lastName = @"Adams";
string firstName = @"Frances";
string invoiceNumber = "PO123456";
int shipMethod = 5;
int specialOffer = 1;
using (AdventureWorksEntities advWorksContext =
new AdventureWorksEntities())
{
try
{
// Get the Contact for the specific customer
// and the related address.
Contact customer = advWorksContext.Contact
.Include("SalesOrderHeader.Address")
.Where("it.LastName = @lastname",
new ObjectParameter("lastname", lastName))
.Where("it.FirstName = @firstname",
new ObjectParameter("firstname", firstName))
.First();
// Get the customer's address to use to create
// a new order with the same address.
Address address = customer.SalesOrderHeader
.First().Address;
// Get the Product with the requested ID.
Product product =
advWorksContext.Product.Where("it.ProductID = @product_id",
new ObjectParameter("product_id", productId)).First();
// Create a new SalesOrderHeader using the static
// CreateSalesOrderHeader method.
SalesOrderHeader order = SalesOrderHeader.CreateSalesOrderHeader(0,
Convert.ToByte(1), DateTime.Now, DateTime.Today.AddMonths(2),
Convert.ToByte(1), false, string.Empty, customer.ContactID, shipMethod,
0, 0, 0, 0, Guid.NewGuid(), DateTime.Now);
// Set addition order properties.
order.Address = address;
order.Address1 = address;
order.PurchaseOrderNumber = invoiceNumber;
// Create a new SalesOrderDetail using the static
// CreateSalesOrderDetail method.
SalesOrderDetail item = SalesOrderDetail.CreateSalesOrderDetail(
1, 0, quantity, product.ProductID, specialOffer, product.StandardCost,
0, 0,Guid.NewGuid(), DateTime.Now);
// Add item to the items collection and
// add order to the orders collection.
order.SalesOrderDetail.Add(item);
customer.SalesOrderHeader.Add(order);
// Call a custom method to recalculate totals.
// For more information, see "Customizing Objects."
order.UpdateOrderTotal();
// Save changes pessimistically. This means that changes
// must be accepted manually once the transaction succeeds.
advWorksContext.SaveChanges();
Console.WriteLine("Order created with order number: "
+ order.SalesOrderNumber);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}