2013-05-06 2 views
2

У меня есть контекст, который содержит такие вещи, как:Имея проблемы при создании макета контекста в Entity Framework 5

public partial class MyEntities : DbContext 
{ 
    ... 
    public DbSet<Cat> Cats { get; set; } 
} 

И я хочу, чтобы дразнить его.

Я создаю еще один частичный класс, который реализует интерфейс, который я называю IContext.

я должен поставить в этот интерфейс

public interface IContext 
{ 
    DbSet<Cat> Cats { get; set; } 
} 

Тогда я могу создать макет и все довольны.

За исключением я не хочу использовать DbSet<Cat> в моем интерфейсе. Это кажется неправильным, поскольку я не буду использовать базу данных. Есть ли способ изменить его или лучшее решение? Очевидно, что контекст автогенерируется из шаблона, поэтому я не могу его редактировать без его потери при регенерации.

Я не уверен, как действовать при создании фальшивого контекста. Есть идеи?

ответ

2

Существует способ.

Вы можете вернуть IDbSet вместо DbSet, а затем в макетной настройке вы можете предоставить издеваемую IDbSet в качестве возвращаемого значения из свойства Cats в вашем издеваемом IContext.

public interface IContext 
{ 
    IDbSet<Cat> Cats{get;set;} 
} 
public partial class MyEntities : DbContext , IContext 
{ 
    public IDbSet<Cat> Cats { get; set; } 
} 

Но, возможно, даже лучше, в вашем интерфейсе не вводить свойство для каждого класса сущности. InstEd ваш IDbContext может быть только:

public interface IContext 
{ 
    IDbSet<T> Set<T>(); 
} 

, что вы можете запросить с

var query = dbContext.Set<Cat>().Where(....) 

Таким образом, вы не должны иметь никаких проблем с «ложными» это.

+0

Я не знаю, как я могу изменить '' DbSet к '' IDbSet , потому что '' DbSet существует в авто сгенерированных 'MyEntities' класса – NibblyPig

+0

Не уверен, как вы Автогенераторный. Если вы используете шаблон T4 для этого, вы можете его изменить, это не должно быть большой проблемой. Вы все еще можете пойти с T Set (). Но это потребует, чтобы вы записывали свои запросы по-другому, не используя свойства набора DbContext. – jure

+0

@jure Вы хотите сказать 'IDbSet Set ();'? Просто 'T' для типа возврата будет означать' Set () 'возвращает' Cat'. – grant

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