2013-04-30 3 views
0
public interface IDepartmentDataSource 
{ 
    IQueryable<Department> Departments { get; } 
} 

public class DepartmentDb : DbContext, IDepartmentDataSource 
{ 
    //Error: property cannot implement property.... 
    public DbSet<Department> Departments { get; set; } 


    //should be: 
    //public IQueryable<Department> Departments { get; set; } 
} 

(используется код из Pluralsight)DbSet <TEntity>, IQueryable <TEntity> - концепции ООП

Из MSDN:

public class DbSet<TEntity> : DbQuery<TEntity>, 
IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, 
IQueryable, IEnumerable 
where TEntity : class 

Почему я должен конкретно реализовать в IQueryable?

ответ

0
public class DepartmentDb : DbContext, IDepartmentDataSource 
{ 
    //Error: property cannot implement property.... 
    public DbSet<Department> Departments { get; set; } 
} 

public class MyQueryable<T> : IQueryable<T> {} 

.... 

MyDepartmentDb.Departments = new MyQueryable<Department>(); // Error! 
// but it implements IDepartmentDataSource 
// which should let any IQueryable<Department> in, so what gives?? 

Потому что код выше не будет работать, но должен. то есть вы должны иметь возможность присвоить IQueryable<Department> имущество Departments, а не только DbSet<Department>.

1
public class DepartmentDb : DbContext, IDepartmentDataSource 
{ 
    public DbSet<Department> Departments { get; set; } 

    IQueryable<Department> IDepartmentDataSource.Departments 
    { 
     get { return Departments; } 
    } 
} 

Вы должны явно установить ваш DbSet из интерфейса класса IDepartmentDataSource.

+0

Не объясняет, почему вы должны явно это делать, но это правильный способ сделать это. – kjbartel

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