2013-08-07 1 views
0

기존 DB 응용 프로그램 (SQL 서버) 위에 .NET 웹 응용 프로그램을 작성하고 있습니다. 원래 개발자는 money 또는 decimal 대신 float 열에 금액을 저장했습니다. 내 POCO 내부에서 Decimal을 사용하고 싶습니다 (특히 내가 값을 얻은 후에 추가 연산을 수행 할 것이기 때문에).10 진수 속성을 float db 열에 매핑 할 수 있습니까?

불행히도 DB 스키마를 접할 수 없습니다. 내 POCO에서 여전히 Decimal을 사용하고 EF에게 "괜찮습니다. 나는 decimalfloat이 맞지 않는다는 것을 알고 있습니다. 나는 그다지 좋아하지 않습니다. 최선을 다하십시오." 특별한 구성으로

, 나는이 오류 얻을 : 나는 modelBuilder.Entity(Of myPocoType).Property(Function(x) x.MoneyProperty).HasColumnType("float")를 사용하여 시도

The specified cast from a materialized 'System.Double' type to the 'System.Decimal' type is not valid.

을, 그러나 그것은 나에게이 오류 가져옵니다

이 같은
Schema specified is not valid. Errors: 
(195,6) : error 0063: Precision facet isn't allowed for properties of type float. 
(195,6) : error 0063: Scale facet isn't allowed for properties of type float. 
+0

[Entity Framework 코드 첫 번째 맵은 C#에서 부동 소수점 수는 SQL Server에서 소수점 이하 여야 함] (http://stackoverflow.com/questions/14221227/can-entity-framework-code-first-map-floats- in-c-sharp-to-decimals-in-sql-serv) –

+1

보기를 사용하여 추악한 해결 방법을 피하는 방법은 무엇입니까? – OzrenTkalcecKrznaric

+0

@ OzrenTkalčecKrznarić DB에 대한 읽기 전용 권한이 있습니다. 거기에 많은 데이터가 있고 내 변경 사항이 "실수로"아무 것도 부러지지 않게하려는 것입니다. –

답변

1

뭔가 작동합니다 :

public class MyPocoType 
{ 
    public float FloatProp { get; set; } 

    [NotMapped] 
    public decimal DecimalProp 
    { 
     get 
     { 
      return (decimal)FloatProp; 
     } 
     set 
     { 
      FloatProp = (float)value; 
     } 
    } 
} 

EF는 decimal을 무시하지만 사용할 수 있습니다. 기본이되는 float을 설정합니다. 원하는 특별한 것이 있으면 정밀도 손실을 처리하기위한 논리를 추가 할 수 있으며 값이 변환되는 범위를 벗어나는 경우를 파악해야 할 수도 있습니다 (float의 범위가 훨씬 넓습니다. , 그러나 decimal에는 훨씬 더 정밀도가있다).

완벽한 솔루션은 아니지만, float이 붙어 있다면 훨씬 좋아지지 않을 것입니다. float은 본질적으로 조금 퍼지기 때문에 어딘가에 당신을 데려다 줄 것입니다.

실제로 복잡해지기를 원하면 내부적으로 십진수 값을 유지 한 다음 저장시 발생하는 다양한 이벤트 (재정의 된 SaveChanges()의 일부 논리 또는 아마도 SavingChanges 이벤트를 포착)를 사용하여 float 한 번만 사용하면 전환 오류가 발생하지 않습니다.

+1

상점 특유의 속성으로 내 POCO가 어지럽게 흩어지는 것을 피하려고했습니다. 'DbContext' 내에서 이것을 독점적으로 수행 할 방법이 없습니까? –

+0

나는 당신이이 메소드들을 오버라이드 (override)하여이 객체들을 꺼낼 때 그 값들을 꺼내서 대신에 'decimal' 프라퍼티를 가진 객체의 인스턴스를 생성 한 다음 그 객체를 저장할 때 역순으로 할 수 있다고 생각한다. 데이터 액세스 계층의 구조에 따라 이는 사소한 것일 수 있으므로 여러 곳에서 변경해야합니다. 필자의 조언 : 데이터 접근을 리팩토링하여 항상 한 가지 방법으로 접근 할 수 있습니다. (아마도 '()'을 읽는 것이고,'() .Add()'를 저장하면됩니다) 그리고'float'/십진수 '변환 논리는이 둘에 국한되어있다. 좀 못생긴지만 작동해야합니다. – anaximander

관련 문제