2009-06-04 7 views
8

값 개체에 ID가 없습니다. ORM은 데이터베이스를 업데이트하기 위해 ID가 필요합니다.DDD, 값 개체 및 ORM

ORM을 트릭하는 방법은 무엇입니까?

(값 개체의 내부 ID는 작동하지 않으므로 ORM이 다른 어셈블리에 있고 동일한 어셈블리로 이동하는 것이 허용되지 않습니다.)

미리 감사드립니다.

답변

4

DDD에 대한 제 이해는 값 개체가 엔티티를 분할하는 데 불과합니다. 값 개체가 데이터베이스에 ID와 함께 저장되어야하는 경우 값 개체가 아닙니다.

예 : 도메인 모델이 (C#을)처럼 보이는

:

public class Customer : Entity 
{ 
    public Guid CustomerID { get; } 

    public string LastName { get; set; } 

    public Address HomeAddress { get; set; } 
} 

public class Address : ValueObject 
{ 
    public string Street { get; set; } 

    public string City { get; set; } 

    public string ZipCode { get; set; } 
} 

이 (의사-SQL)과 같이 보일 것 해당 데이터베이스 테이블 :

CREATE TABLE Customers 
(
    CustomerID, 

    LastName, 

    HomeAddress_Street, 

    HomeAddress_City, 

    HomeAddress_ZipCode, 
) 

주소를 별도의 테이블에 저장하려면 ID가있는 엔티티로 만듭니다.

+5

그러나 도메인 모델은 단지 데이터베이스의 1 : 1이며 주소는 여전히 값 개체가 될 수 있으며 여전히 별도의 테이블을 가지고 있습니다. – TWith2Sugars

+1

아니요, 데이터베이스의 1 : 1이 아닙니다. Customer 클래스와 Adress 클래스 (값 객체)가 있습니다. NHibernate에서, 값 객체는 컴포넌트로 매핑된다. ID를 필요로하는 엔티티를 갖게되면 더 이상 값 객체가 아닙니다. –

+6

그러나 주소를 테이블에 저장해야하는 경우 데이터베이스에서 ID가 필요합니다. 데이터베이스가 id를 요구한다고해서 객체가 즉시 엔티티라는 것을 의미하지는 않습니다. – TWith2Sugars

3

개인적으로 값 개체에 ID 필드가 있습니다.이 값 개체의 다른 특성 (예 : 이름, 위치 등)으로 처리합니다.

사실 DDD가 아닐 수도 있지만 저에게는 효과적 일 수 있습니다.

+2

전혀 문제가 없다고 생각합니다. 에릭 에반 (Eric Evan)은 예를 들지 않고 개념에 대해 이야기하기가 쉽기 때문에 모두가 돌아 다니고 있습니다. –

35

Eric Evans가 "엔티티는 ID가 있습니다. 값 객체는 아닙니다"라고 말하면 데이터베이스의 ID 열에 대해 말하지 않고 있습니다. ID가 인 개념으로 나타납니다.

VO에는 없음 개념 신원이 있습니다. 그렇다고해서 지속성 신분이 없어야한다는 의미는 아닙니다. 퍼시스턴스 구현으로 Entity vs VO에 대한 이해를 흐리게하지 마십시오.

내 게시물 here을 참조하십시오.

+0

하지만 코드에서 개념적 정체성의 부족을 보여주고 싶습니다. Btw, 전에 그 게시물을 봤어요. –

+1

요구 사항을 명확히하기 위해 : VO 개체의 ID 속성을 숨기고 싶지만 ORM이 있어야 ID 속성을 볼 수 있습니까? 두 가지 질문 : 1) ORM이 개인/내부 입력란에 액세스 할 수 있습니까? (NHibernate와 같은) 2) VO의 ID 속성을 '숨겨서'얼마나 많은 이익을 얻습니까? –

+0

언급을 잊어 버렸습니다 - NHibernate를 사용하고 있습니다 ... 그래서 NHibernate로 어떻게할까요? –