2013-04-03 3 views
0

У меня есть некоторые простые объектыMVC4 и Entity Framework Наследование и Include

public class DataClass 
{ 
    public int id; 
    public string Data; 
} 

public class Job() 
{ 
    public int id; 
} 

public class NewJob : Job 
{ 
    public DateTime StartDate; 
    public DataClass data; 
} 

Я тогда определил их в моем DbContext()

public DbSet<Job> Jobs { get; set; }   
    public DbSet<DataClass> DataClass { get; set; } 

Теперь, если я использую следующий код

NewJob job = (NewJob) db.Jobs.Find(id); 

Это работает нормально, но возвращает «данные» в качестве нуля

Я знаю, что я определяю класс с ключевым словом virtual, и он работает и заполняет объект «data».

public class NewJob : Job 
{ 
    public DateTime StartDate; 
    public virtual DataClass data; 
} 

Но в моем случае я, как правило, не хочу, чтобы объект данных был заполнен. Поэтому мне нужно загрузить его по требованию.

Если я пытаюсь что-то вроде

NewJob job = (NewJob)db.Jobs.Include("data").First(); 

я получаю исключение

А указанный Включать путь не является допустимым. EntityType «Models.Job» не объявляет свойство навигации с именем «данные».

Я думаю, это потому, что он смотрит на «работу», а не на «NewJob», когда он пытается включить include.

Мне также не нравится включать строку, не проверяя время разработки.

ответ

1

Похоже, вы пытаетесь преобразовать объект данных в объект домена с помощью литья типов, что является очень плохой идеей. То, что вы хотите сделать, это захватить ваш объект данных, создать экземпляр объекта домена и сопоставить свои значения данных с объектом домена с помощью некоторого типа вспомогательного класса. Очень полезным инструментом, который я использовал, является Automapper. Это инструмент, который позволит вам сопоставить один объект с другим. Это также позволяет использовать регулярное выражение для сопоставления, если соглашения об именах между двумя объектами различны.

+0

Привет, вы говорите, что тип кастинга - очень плохая идея - почему это? Логически это то, что я хочу делать с объектом. – Chris

+0

Извините за поздний ответ, был довольно занят. Вы просто хотите использовать литье типов, когда хотите преобразовать объект в свою базовую модель или наоборот.Бросить один объект на совершенно другой объект без полиморфных отношений - это плохая практика и плохая идея, поскольку она может вводить необработанные исключения/ошибки, которые вы не будете контролировать. Вам лучше делать некоторые типы картографирования, и в этом случае у вас будет больше контроля над вашими конверсиями. – RiceRiceBaby

0

Если вы используете Entity Framework Code First и хотите создать экземпляры производных классов/сущность, вы должны сделать следующее:

using (var db = new MyDbContext()) 
{ 
    var newJob = db.Jobs.Create<NewJob>(); 
    newJob.data.Data = "some data for a new job"; // this is string Data from DataClass 

    db.Jobs.Add(newJob); 
    db.SaveChanges(); 
} 
-1

После долгих поисков я нашел следующий, который может помочь.

Если вы включите пространство имен System.Data.Entity в вашей помощи пункта, то вы можете использовать метод расширения .INCLUDE() после OfType <>(), который не является обычно доступны.

Немного отличается образец кода

using System.Data.Entity; 

NewJob job = (NewJob)db.Jobs.OfType<NewJob>().Include(m => m.data).Where(x => x.id == id).FirstOrDefault(); 

Это, кажется, работает для меня в этом примере я использовал.

Смежные вопросы