Можно ли сопоставить тип с неявным преобразованием с помощью Entity Framework? - PullRequest
2 голосов
/ 03 января 2012

Я знаю, что это работает с 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 или иным образом разрешать неявные преобразования?

1 Ответ

2 голосов
/ 03 января 2012

Нет. EF поддерживает только несколько базовых типов и сложные типы. Преобразования не поддерживаются (EF даже не позволяет вам записывать преобразование явно). Также, как упомянул @Slauma в комментарии, ваше неявное преобразование не будет иметь смысла для Linq-to-entity, поскольку логика преобразования C # не переводится в SQL.

...