Ошибка в EntityFramework? .Include и конструктор без параметров - PullRequest
0 голосов
/ 17 августа 2011

Краткая справка:

Использование базы данных сначала / только код (хотя я не думаю, что это имеет значение)

Базовая настройка такова:

public class MyContext : DbContext
{
    public DbSet<MyClass_MyClasses> MyClass_MyClasses { get; set; }
    public DbSet<MyClass> MyClasses { get; set; }
}

public class MyClass_MyClasses
{
    [Key]
    [Column(Order = 0)]
    public Guid ParentId { get; set; }

    [Key]
    [Column(Order = 1)]
    public Guid MyClassId { get; set; }

    public int Sequence { get; set; }

    public virtual MyClass MyClass { get; set; }
}

public class MyClass
{
    [Key]
    public Guid Id { get; set; }

    public string Url { get; set; }

    // ...
}

// interface part isn't important, I'm just using the wrapper to
// combine data from different sources to eventually be passed to a Json service
public class EntityWrapper : ISomeInterface
{
    public MyClass_MyClasses Relation { get; set; }

    public string Url { get { return MyClass_MyClasses.MyClass.Url; } }

    // ... some other stuff

    public EntityWrapper() { }
}

Проблема, похоже, в том, что .Include (Func <,>) не соблюдается, когда я делаю что-то вроде этого:

using(MyContext context = new MyContext())
{

    IEnumerable<EntityWrapper> wrappedResults =
        from relation in context.MyClass_MyClasses.Include(mm => mm.MyClass)
        orderby  relation.Sequence ascending
        select new EntityWrapper { Relation = relation };

    foreach(EntityWrapper wrapper in wrappedResults)
    {
        // always thrown
        if(wrapper.Relation.MyClass == null)
            throw new WtfException("But I specified .Include?");
    }
}

Я работал над этим, вместо того, чтобы выбрать EntityWrapper, выбрать MyClass_MyClasses и затем в моем foreach просто присвоить локальную переменную = new EntityWrapper { ... }, которая работает.

Мой вопрос: Я что-то делаю неправильно? или это ошибка с EF?

Также: заранее извиняюсь, это парафраз реального кода, поэтому некоторые вещи могут не совпадать ... Если это не воспроизводимо, я постараюсь скопировать более прямые версии моих классов.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Include и проекция дизъюнктивны = после использования проекции Include не используется автоматически.Попробуйте это:

var results =
    from relation in context.MyClass_MyClasses.Include(mm => mm.MyClass)
    orderby  relation.Sequence ascending
    select relation;

foreach(EntityWrapper wrapper in results.ToList()
                                        .Select(r => new EntityWrapper { Relation = r }))
{
    // always thrown
    if(wrapper.Relation.MyClass == null)
        throw new WtfException("But I specified .Include?");
}

Вы также можете попробовать использовать AsEnumerable вместо ToList

0 голосов
/ 17 августа 2011

попробуйте удалить ключевое слово virtual.

public virtual MyClass MyClass { get; set; }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...