0

我正在使用按层次结构表(TPH)。例如,我们有一个所有实体的基类:

public abstract class Entity
    {
        public virtual int Id { get; set; }

        public virtual bool IsTransient()
        {
            return Id == default(int);
        }
    }

以及几个实体的基类:

public abstract class Event:Entity
    {
        [MaxLength(50)]
        [Required]
        public string Name { get; set; }

        [Required]
        public string Description { get; set; }

        [Required]
        [MaxLength(100)]
        public string ShortDescription { get; set; }

        [Required]
        public DateTime PublishDate { get; set; }

        public int  Duration { get; set; }
    }

public class Film:Event
    {
        public string Director { get; set; }

        public string ActorList { get; set; }

        public override string ToString()
        {
            return Name;
        }
    }

public class Concert:Event
    {
        public string Genre { get; set; }

        public override string ToString()
        {
            return Name;
        }
    }

我的背景:

public class MyContext:DbContext
    {
        public MyContext():base(ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString)
        {
        }

        public DbSet<Event> Events { get; set; }

        public virtual void Commit()
        {
            base.SaveChanges();
        }

    }

这是基本存储库:

public class GenericRepository : IRepository
{
  //...   

    public IEnumerable<TEntity> GetAll<TEntity>() where TEntity : class
            {
                return GetQuery<TEntity>().AsEnumerable();
            } 

    public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
            {          
                var entityName = GetEntityName<TEntity>();
                return ((IObjectContextAdapter)DbContext).ObjectContext.CreateQuery<TEntity>(entityName);
            }

private string GetEntityName<TEntity>() where TEntity : class
        {
            string entitySetName = ((IObjectContextAdapter)DbContext).ObjectContext
                 .MetadataWorkspace
                 .GetEntityContainer(((IObjectContextAdapter)DbContext).ObjectContext.DefaultContainerName, DataSpace.CSpace)  
                 .BaseEntitySets.First(bes => bes.ElementType.Name == typeof(TEntity).Name).Name;

            return string.Format("{0}.{1}", ((IObjectContextAdapter)DbContext).ObjectContext.DefaultContainerName, entitySetName);
        }

    }

接下来,创建上下文和存储库:

var context = new MyContext();
EventRepository repository = new EventRepository(context);
var films = repository.GetAll<Film>();

但是我得到了异常(在GetEntityName方法中):序列没有元素。
我认为是因为Film数据库中没有表。如何解决这个问题呢?

4

1 回答 1

3

GetEntityName在您显示的存储库中看不到需要。因为GetQuery你可以DbContext直接使用 API 而不需要访问底层的ObjectContextor MetadataWorkspace

public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{          
    return DbContext.Set<TEntity>();
}

这将返回一个DbSet<TEntity>(它是一个IQueryable<TEntity>)。我不是 100% 确定如果TEntity派生,这是否也有效,但MSDN 文档DbSet<TEntity>说:“该类型可以是派生类型以及基类型。 ”所以,我希望该Set<TEntity>()方法也允许用于派生类型。

于 2012-11-25T20:22:13.287 回答