Практическое руководство. Создание объекта с помощью статического метода создания (платформа Entity Framework)

Средства Entity Framework используют язык CSDL для формирования кода, который определяет уровень объектов. При создании классов данных каждый класс создается с помощью статического метода производства создать. Этот метод создает объект и задает все свойства класса, которые не могут иметь значения null. Этот метод включает параметр для каждого свойства, которое имеет атрибут Nullable="false" в CSDL-файле, не имеет определенного в модели значения по умолчанию, и доступно Entity Framework . В следующем примере показано задание значения по умолчанию и метод доступа set для свойства в концептуальной модели.

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

Такое определение свойства в концептуальной модели позволяет генератору кода формировать сущность со свойством CarrierTrackingNumber, имеющим значение по умолчанию «1A-2B-3C», и методом доступа set, объявленным как protected.

Используйте этот метод, чтобы создавать объекты с большим числом обязательных свойств.

Пример в этом разделе основан на модели Adventure Works Sales. Чтобы запустить код, используемый в данном разделе, нужно сначала добавить к проекту модель Adventure Works Sales и настроить его для использования платформы Entity Framework. Дополнительные сведения см. в разделе Как использовать мастер моделей EDM (Entity Framework) или Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (Entity Framework).

Пример

Далее приведен пример CSDL-фрагмента для типа SalesOrderDetail в модели Модель AdventureWorks Sales:

<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="http://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>

Далее показан пример статического метода CreateSalesOrderDetail, созданного для класса SalesOrderDetail в модели AdventureWorks:

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();
}

См. также

Основные понятия

Создание, добавление, изменение и удаление объектов (платформа Entity Framework)
Работа с объектами (платформа Entity Framework)