방법: 정적 create 메서드를 사용하여 개체 만들기(Entity Framework)

엔터티 프레임워크 도구는 CSDL(개념 스키마 정의 언어) 파일을 사용하여 개체 계층을 정의하는 코드를 생성합니다. 데이터 클래스가 생성되면 정적 create 팩터리 메서드가 있는 클래스가 생성됩니다. 이 메서드는 개체를 인스턴스화하고 null일 수 없는 클래스의 모든 속성을 설정하는 데 사용됩니다. 메서드에는 CSDL 파일에서 Nullable="false" 특성이 적용된 모든 속성에 대한 매개 변수가 포함됩니다. 필수 속성이 여러 개인 개체를 만들 때 이 메서드를 사용합니다.

이 항목의 예제는 Adventure Works Sales 모델을 기반으로 합니다. 이 예제의 코드를 실행하려면 프로젝트에 AdventureWorks Sales 모델을 추가하고 Entity Framework를 사용하도록 프로젝트를 구성해야 합니다. 이렇게 하려면 방법: Entity Framework 프로젝트 수동 구성방법: 엔터티 데이터 모델 수동 정의(Entity Framework)의 절차를 수행합니다.

예제

다음은 AdventureWorks Sales 모델(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());
    }
}

참고 항목

개념

개체 추가, 수정 및 삭제(Entity Framework)
개체 서비스 개요(Entity Framework)