Я знаю, что это работает с NHibernate, но я новичок в EF-коде и могу посмотреть, как это сделать.
Короче говоря, я хочу сопоставить свойство для моей сущности FooEntity
типа BazCode
, как если бы BazCode
было строкой (или int
, или DateTime
, или как угодно), поскольку BazCode
имеет неявное преобразование в / из этого типа.
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 или иным образом разрешать неявные преобразования?