나는 이것이 NHibernate와 작동한다는 것을 알고있다. 그러나 나는 EF code-first를 처음 접했고 그것을 끝내는 방법을 알 수있다. 한마디로암시 적 변환이있는 형식을 Entity Framework에 매핑 할 수 있습니까?
, 나는 문자열 (또는 int
또는 DateTime
또는 무엇이든)이 있었다 BazCode
것처럼 BazCode
이 유형 /에서 암시 적 변환이 있기 때문에, 유형 BazCode
내 엔티티 FooEntity
에 속성을 매핑 할. 사용량
public class FooEntity
{
public int FooId { get; set; }
public string SomeText { get; set; }
public BazCode Code { get; set; }
}
public class BazCode
{
private readonly string _value;
private BazCode(string s)
{
if(s.Length != 8)
{
throw new ArgumentException("BazCode must be 8 characters.")
}
_value = s;
}
public static implicit operator BazCode(string s)
{
return new BazCode(s);
}
public static implicit operator string(BazCode code)
{
return code._value;
}
}
:
var foo = new FooEntity
{
SomeText = "here is some text",
Code = "A1234567"
}
BazCode
때문에 암시 적 문자열에서, 나는 그냥 작동 일반적으로 NHibernate에의 매핑 할 수 /에 캐스트 할 수 있습니다.
EF를 사용하면 명시 적으로 매핑을 정의하는 유일한 방법은 익명 형식 생성자를 사용하는 것입니다. 그러나 캐스트를 사용할 수 없으므로 아무 것도 구입하지 않습니다.
나는 EF의 복잡한 유형 개념을 알고 있지만, 지금까지 내가 말할 수있는 것과 같은 것은 아니다. 나는 필요한 것이라고 생각 :
context.Foos.Where(foo => foo.BazCode.Value == "B9876543")
대신
context.Foos.Where(foo => foo.BazCode == "B9876543")
이 전혀 암시 적 변환을 활용하지 않습니다.
EF에서 엔티티를 매핑하거나 암시 적 변환을 허용하는 좀 더 정교한 방법이 있습니까?
NH이 마지막 줄을 어떻게 다룰 수 있는지 궁금합니다. 변환 뒤의'=='연산자는 (잠재적으로 임의의 복잡한) C# 코드입니다. 모든 경우에이 방법을 사용하여 데이터베이스로 쿼리를 실행하기 위해 SQL로 변환 할 수 있습니까? 또는 NH이 어떻게 든 변환 연산자의 내용을 "구문 분석"하고 변환 할 수 있으면 SQL로 변환합니까? EF의 경우,'BazCode'가 복합 형이라 할지라도 마지막 줄은 불가능하다고 확신합니다. EF는 엔티티를 매핑하는 방법을 가지고 있지만 슬프게도 그 중 어느 것도 "세련된"것은 아닙니다. 귀하의 경우에는'BazCode' 속성을'string'으로 대체 할 것입니다. – Slauma