0

Table per Hierarchy (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: シーケンスには要素がありません。DBにテーブル
がないからだと思います。Filmこの問題を解決するには?

4

1 に答える 1

3

GetEntityNameあなたが示しているリポジトリには必要性がわかりません。GetQueryAPI を直接使用でき、基になるまたはDbContextにアクセスする必要がないため:ObjectContextMetadataWorkspace

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

DbSet<TEntity>これは(である) を返しますIQueryable<TEntity>派生型でも機能するかどうかは 100% わかりませんがTEntityMSDN のドキュメントにDbSet<TEntity>は次のように書かれています。Set<TEntity>()

于 2012-11-25T20:22:13.287 に答える