2013-04-08 2 views
0

왜 데이터베이스 집합 기본값을 Entity Framework에서 사용할 수 없습니까? 데이터베이스를 디자인 할 때 적합한 기본값 (예 : "기본값 또는 바인딩"필드)을 추가했습니다. 이제는 StoreGeneratedPattern.Computed을 사용하지 않으면 나중에 코드를 기본값으로 지정해야하지만 나중에 값을 변경할 수없는 것으로 보입니다. 코드에 기본값을 지정하지 않으면 예외가 발생합니다.왜 데이터베이스 세트 기본값을 사용할 수 없습니까?

답변

0

여기에 약간의 논리가 있습니다.

엔티티에는 public int ExampleInt {get; 세트; }. Example 열의 기본값을 100으로 설정한다고 가정 해 보겠습니다.

엔티티 객체가 생성되는 상황을 상상해보십시오. 런타임에서 채울 기본값이있는 C# 개체입니다. ExampleInt는 값 0으로 초기화됩니다.이 시점에서 엔티티 개체는 db에 대해 아무것도 모릅니다. 그런 다음 엔티티를 저장하기로 결정했습니다. EF는 행을 작성한 다음 지정한 값을 삽입해야합니다. 하지만 기다려? 이 값을 0 또는 100으로 설정해야합니까? EF는 필드를 변경했는지 추적해야하지만 엔티티 개체를 만든 경우 EF는 첨부 할 때까지는 개체 개체를 인식하지 못합니다.

그냥 아이디어 : 생성자에서 쿼리를 실행하여 기본값을 확인하면 어떨까요? 이것은 객체를 생성하는 순간 디폴트 값으로 채워질 것입니다. 개체가 EF에 의해 만들어진 경우 해당 값은 사용자가 db에있는 값으로 덮어 쓰게됩니다. 사실, 나는 더 좋은 생각을 가지고있다.

왜 새로운 엔티티 객체를 생성하기 위해 factory를 사용하지 않습니까? 팩토리는 db에 기본값을 쿼리 할 수 ​​있습니까? 여전히 좋지는 않지만 constructre에서 쿼리를 실행하는 것이 훨씬 좋습니다. 따라서 :

public class ExampleFactory 
{ 
    public static GetExample() 
    { 
     // obviously you want to run it only once. This is example only. 
     int defaultValue = dbContext.Database.SQLQuery("SqlToGetTheDefaultValue"); 
     return new Example { ExampleInt = defaultValue }; 
    } 
} 

그래서 거기에 가야합니다. 이제 EF가 왜 이것을 할 수 없는지 당신은 알고 있습니다. 그리고 나는 또한 당신에게이 문제를 어떻게 해결할 수 있는지에 대한 아이디어를주었습니다.

+0

그러나 EF 메타 데이터에 기본값이 포함될 수 있으면 데이터베이스가 업데이트 될 때마다 업데이트해야합니다. 나는 한 곳 이상에서 상수 값을 갖는 것을 좋아하지 않는다. * 한숨 * – Jordan

+0

나는 동의한다, 좋을 수 있었다. http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions –

+0

"StoreGeneratedPattern.Computed가있는 속성은 응용 프로그램에서 설정할 수 있지만 값은 사용되지 않습니다. 유일한 예외는 다음과 같습니다. 속성은 ConcurrencyMode.Fixed를 사용합니다. 이러한 속성은 컨텍스트에서 엔터티가 추적되지 않을 때만 사용되지만 Entity Framework에서 낙관적 인 동시 처리에서 큰 문제가되므로 다른 블로그 게시물에서이 문제를 자세히 설명합니다. " http://www.ladislavmrnka.com/2011/03/the-bug-in-storegeneratedpattern-fixed-in-vs-2010-sp1/ –

관련 문제