방법: EntityKey 만들기(Entity Framework)
EntityKey 클래스는 엔터티 개체의 키를 나타냅니다. 클래스 생성자를 사용하여 EntityKey의 인스턴스를 만들거나, ObjectContext의 정적 CreateEntityKey 메서드를 사용하여 특정 개체에 대한 EntityKey를 생성할 수 있습니다. 엔터티 키는 개체를 연결하거나 데이터 소스에서 특정 개체를 반환하는 데 사용됩니다. 자세한 내용은 엔터티 키 사용(Entity Framework)을 참조하십시오.
이 항목의 예제는 Adventure Works Sales 모델을 기반으로 합니다. 이 예제의 코드를 실행하려면 프로젝트에 AdventureWorks Sales 모델을 추가하고 Entity Framework 를 사용하도록 프로젝트를 구성해야 합니다. 이렇게 하려면 방법: Entity Framework 프로젝트 수동 구성 및 방법: 수동으로 모델 및 매핑 파일 정의(Entity Framework)의 절차를 수행합니다.
예제
다음 예제에서는 지정된 키/값 쌍과 정규화된 엔터티 집합 이름을 사용하여 EntityKey의 인스턴스를 만듭니다. 이 키는 개체 자체를 검색하는 데 사용됩니다.
Using context As New AdventureWorksEntities()
Dim entity As Object = Nothing
Dim entityKeyValues As IEnumerable(Of KeyValuePair(Of String, Object)) = _
New KeyValuePair(Of String, Object)() {New KeyValuePair(Of String, Object)("SalesOrderID", 43680)}
' Create the key for a specific SalesOrderHeader object.
Dim key As New EntityKey("AdventureWorksEntities.SalesOrderHeaders", entityKeyValues)
' Get the object from the context or the persisted store by its key.
If context.TryGetObjectByKey(key, entity) Then
Console.WriteLine("The requested " & entity.GetType().FullName & " object was found")
Else
Console.WriteLine("An object with this key could not be found.")
End If
End Using
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
Object entity = null;
IEnumerable<KeyValuePair<string, object>> entityKeyValues =
new KeyValuePair<string, object>[] {
new KeyValuePair<string, object>("SalesOrderID", 43680) };
// Create the key for a specific SalesOrderHeader object.
EntityKey key = new EntityKey("AdventureWorksEntities.SalesOrderHeaders", entityKeyValues);
// Get the object from the context or the persisted store by its key.
if (context.TryGetObjectByKey(key, out entity))
{
Console.WriteLine("The requested " + entity.GetType().FullName +
" object was found");
}
else
{
Console.WriteLine("An object with this key " +
"could not be found.");
}
}
독립 연결의 경우 다음 예제에 설명된 메서드를 사용하여 관계를 정의합니다. 외래 키 연결의 경우 종속 개체에 대한 외래 키 속성의 값을 설정하여 관계를 정의합니다. 자세한 내용은 관계 정의 및 관리(Entity Framework)를 참조하십시오.
다음 예제에서는 지정된 키 이름, 키 값 및 정규화된 엔터티 집합 이름을 사용하여 EntityKey의 인스턴스를 만듭니다. 이 키는 개체를 연결하고 관계를 정의하는 데 사용됩니다.
Using context As New AdventureWorksEntities()
Try
' Create the key that represents the order.
Dim orderKey As New EntityKey("AdventureWorksEntities.SalesOrderHeaders", "SalesOrderID", orderId)
' Create the stand-in SalesOrderHeader object
' based on the specified SalesOrderID.
Dim order As New SalesOrderHeader()
order.EntityKey = orderKey
' Assign the ID to the SalesOrderID property to matche the key.
order.SalesOrderID = CInt(orderKey.EntityKeyValues(0).Value)
' Attach the stand-in SalesOrderHeader object.
context.SalesOrderHeaders.Attach(order)
' Create a new SalesOrderDetail object.
' You can use the static CreateObjectName method (the Entity Framework
' adds this method to the generated entity types) instead of the new operator:
' SalesOrderDetail.CreateSalesOrderDetail(1, 0, 2, 750, 1, (decimal)2171.2942, 0, 0,
' Guid.NewGuid(), DateTime.Today));
Dim detail = New SalesOrderDetail With
{
.SalesOrderID = 0,
.SalesOrderDetailID = 0,
.OrderQty = 2,
.ProductID = 750,
.SpecialOfferID = 1,
.UnitPrice = CDec(2171.2942),
.UnitPriceDiscount = 0,
.LineTotal = 0,
.rowguid = Guid.NewGuid(),
.ModifiedDate = DateTime.Now
}
order.SalesOrderDetails.Add(detail)
context.SaveChanges()
Catch generatedExceptionName As InvalidOperationException
Console.WriteLine("Ensure that the key value matches the value of the object's ID property.")
Catch generatedExceptionName As UpdateException
Console.WriteLine("An error has occured. Ensure that an object with the '{0}' key value exists.", orderId)
End Try
End Using
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
try
{
// Create the key that represents the order.
EntityKey orderKey =
new EntityKey("AdventureWorksEntities.SalesOrderHeaders",
"SalesOrderID", orderId);
// Create the stand-in SalesOrderHeader object
// based on the specified SalesOrderID.
SalesOrderHeader order = new SalesOrderHeader();
order.EntityKey = orderKey;
// Assign the ID to the SalesOrderID property to matche the key.
order.SalesOrderID = (int)orderKey.EntityKeyValues[0].Value;
// Attach the stand-in SalesOrderHeader object.
context.SalesOrderHeaders.Attach(order);
// Create a new SalesOrderDetail object.
// You can use the static CreateObjectName method (the Entity Framework
// adds this method to the generated entity types) instead of the new operator:
// SalesOrderDetail.CreateSalesOrderDetail(1, 0, 2, 750, 1, (decimal)2171.2942, 0, 0,
// Guid.NewGuid(), DateTime.Today));
SalesOrderDetail detail = new SalesOrderDetail
{
SalesOrderID = orderId,
SalesOrderDetailID = 0,
OrderQty = 2,
ProductID = 750,
SpecialOfferID = 1,
UnitPrice = (decimal)2171.2942,
UnitPriceDiscount = 0,
LineTotal = 0,
rowguid = Guid.NewGuid(),
ModifiedDate = DateTime.Now
};
order.SalesOrderDetails.Add(detail);
context.SaveChanges();
}
catch (InvalidOperationException)
{
Console.WriteLine("Ensure that the key value matches the value of the object's ID property.");
}
catch (UpdateException)
{
Console.WriteLine("An error has occured. Ensure that an object with the '{0}' key value exists.",
orderId);
}
}
다음 예제에서는 분리된 개체에서 키 값을 사용하여 EntityKey의 인스턴스를 만듭니다. 이 키는 연결된 개체 인스턴스를 검색하는 데 사용됩니다.
Private Shared Sub ApplyItemUpdates(ByVal updatedItem As SalesOrderDetail)
' Define an ObjectStateEntry and EntityKey for the current object.
Dim key As EntityKey
Dim originalItem As Object
Using context As New AdventureWorksEntities()
' Create the detached object's entity key.
key = context.CreateEntityKey("SalesOrderDetails", updatedItem)
' Get the original item based on the entity key from the context
' or from the database.
If context.TryGetObjectByKey(key, originalItem) Then
' Call the ApplyCurrentValues method to apply changes
' from the updated item to the original version.
context.ApplyCurrentValues(key.EntitySetName, updatedItem)
End If
context.SaveChanges()
End Using
End Sub
private static void ApplyItemUpdates(SalesOrderDetail updatedItem)
{
// Define an ObjectStateEntry and EntityKey for the current object.
EntityKey key = default(EntityKey);
object originalItem = null;
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Create the detached object's entity key.
key = context.CreateEntityKey("SalesOrderDetails", updatedItem);
// Get the original item based on the entity key from the context
// or from the database.
if (context.TryGetObjectByKey(key, out originalItem))
{
// Call the ApplyCurrentValues method to apply changes
// from the updated item to the original version.
context.ApplyCurrentValues(key.EntitySetName, updatedItem);
}
context.SaveChanges();
}
}
참고 항목
작업
방법: 개체 키를 사용하여 특정 개체 반환(Entity Framework)