如何:使用静态 Create 方法创建对象(实体框架)

实体框架 工具使用概念架构定义语言 (CSDL) 生成用于定义对象层的代码。 当生成数据类时,将使用静态 create 工厂方法生成每个类。 此方法实例化某个对象并设置该类的不能为 null 的所有属性。 该方法对于在 CSDL 中已应用 Nullable="false" 特性的每个属性都具有一个参数,这些属性没有在模型中定义默认值并且实体框架 可以访问这些属性。 下面的示例演示如何指定概念模型中某属性的默认值和 set 访问器。

<Property Name="CarrierTrackingNumber" Type="String" MaxLength="25" Unicode="true" FixedLength="false" 
          DefaultValue="1A-2B-3C"
          a:SetterAccess="Protected" xmlns:a="https://schemas.microsoft.com/ado/2006/04/codegeneration" />

使用概念模型中的此属性定义,代码生成器将生成一个实体,该实体具有一个默认值为“1A-2B-3C”且 set 访问器为 protectedCarrierTrackingNumber 属性。

当创建具有许多必需属性的对象时使用此方法。

本主题中的示例基于 Adventure Works 销售模型。若要运行本主题中的代码,则必须已经将 Adventure Works 销售模型添加到了您的项目中,并且已经将项目配置为使用实体框架。有关更多信息,请参见如何:使用实体数据模型向导(实体框架)如何:手动配置实体框架项目如何:手动定义实体数据模型(实体框架)

示例

以下是用于 AdventureWorks 销售模型 中的 SalesOrderDetail 类型的 CSDL 段示例:

<EntityType Name="SalesOrderDetail">
  <Key>
    <PropertyRef Name="SalesOrderID" />
    <PropertyRef Name="SalesOrderDetailID" />
  </Key>
  <Property Name="SalesOrderID" Type="Int32" Nullable="false" />
  <Property Name="SalesOrderDetailID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
  <Property Name="CarrierTrackingNumber" Type="String" MaxLength="25" Unicode="true" FixedLength="false" 
            DefaultValue="1A-2B-3C"
            a:SetterAccess="Protected" xmlns:a="https://schemas.microsoft.com/ado/2006/04/codegeneration" />
  <Property Name="OrderQty" Type="Int16" Nullable="false" />
  <Property Name="ProductID" Type="Int32" Nullable="false" />
  <Property Name="SpecialOfferID" Type="Int32" Nullable="false" />
  <Property Name="UnitPrice" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
  <Property Name="UnitPriceDiscount" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
  <Property Name="LineTotal" Type="Decimal" Nullable="false" Precision="38" Scale="6" annotation:StoreGeneratedPattern="Computed" />
  <Property Name="rowguid" Type="Guid" Nullable="false" />
  <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
  <NavigationProperty Name="SalesOrderHeader" Relationship="AdventureWorksModel.FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID" FromRole="SalesOrderDetail" ToRole="SalesOrderHeader" />
</EntityType>

以下是为 AdventureWorks 中的 SalesOrderDetail 类生成的静态 CreateSalesOrderDetail 方法的示例:

Public Shared Function CreateSalesOrderDetail(ByVal salesOrderID As Global.System.Int32, ByVal salesOrderDetailID As Global.System.Int32, ByVal orderQty As Global.System.Int16, ByVal productID As Global.System.Int32, ByVal specialOfferID As Global.System.Int32, ByVal unitPrice As Global.System.Decimal, ByVal unitPriceDiscount As Global.System.Decimal, ByVal lineTotal As Global.System.Decimal, ByVal rowguid As Global.System.Guid, ByVal modifiedDate As Global.System.DateTime) As SalesOrderDetail
    Dim salesOrderDetail As SalesOrderDetail = New SalesOrderDetail
    salesOrderDetail.SalesOrderID = salesOrderID
    salesOrderDetail.SalesOrderDetailID = salesOrderDetailID
    salesOrderDetail.OrderQty = orderQty
    salesOrderDetail.ProductID = productID
    salesOrderDetail.SpecialOfferID = specialOfferID
    salesOrderDetail.UnitPrice = unitPrice
    salesOrderDetail.UnitPriceDiscount = unitPriceDiscount
    salesOrderDetail.LineTotal = lineTotal
    salesOrderDetail.rowguid = rowguid
    salesOrderDetail.ModifiedDate = modifiedDate
    Return salesOrderDetail
End Function
public static SalesOrderDetail CreateSalesOrderDetail(global::System.Int32 salesOrderID, global::System.Int32 salesOrderDetailID, global::System.Int16 orderQty, global::System.Int32 productID, global::System.Int32 specialOfferID, global::System.Decimal unitPrice, global::System.Decimal unitPriceDiscount, global::System.Decimal lineTotal, global::System.Guid rowguid, global::System.DateTime modifiedDate)
{
    SalesOrderDetail salesOrderDetail = new SalesOrderDetail();
    salesOrderDetail.SalesOrderID = salesOrderID;
    salesOrderDetail.SalesOrderDetailID = salesOrderDetailID;
    salesOrderDetail.OrderQty = orderQty;
    salesOrderDetail.ProductID = productID;
    salesOrderDetail.SpecialOfferID = specialOfferID;
    salesOrderDetail.UnitPrice = unitPrice;
    salesOrderDetail.UnitPriceDiscount = unitPriceDiscount;
    salesOrderDetail.LineTotal = lineTotal;
    salesOrderDetail.rowguid = rowguid;
    salesOrderDetail.ModifiedDate = modifiedDate;
    return salesOrderDetail;
}

以下是有关如何使用静态 CreateSalesOrderDetail 方法以创建和保存 SalesOrderDetail 对象的示例:

Dim orderId As Integer = 43680
Using context As New AdventureWorksEntities()
    Dim order = (From o In context.SalesOrderHeaders
        Where o.SalesOrderID = orderId
        Select o).First()

    ' Add a new item. 
    Dim newItem As SalesOrderDetail = SalesOrderDetail.CreateSalesOrderDetail(0, 0, 5, 711, 1, CDec(13.0368), _
    0, 0, Guid.NewGuid(), DateTime.Now)
    order.SalesOrderDetails.Add(newItem)

    context.SaveChanges()
End Using
int orderId = 43680;
using (AdventureWorksEntities context
    = new AdventureWorksEntities())
{
    var order = (from o in context.SalesOrderHeaders
                 where o.SalesOrderID == orderId
                 select o).First();

    // Add a new item.
    SalesOrderDetail newItem = SalesOrderDetail.CreateSalesOrderDetail(
        0, 0, 5, 711, 1, (decimal)13.0368,
        0, 0, Guid.NewGuid(), DateTime.Now);
    order.SalesOrderDetails.Add(newItem);

    context.SaveChanges();
}

另请参见

概念

创建、添加、修改和删除对象(实体框架)
使用对象(实体框架)