【问题标题】:DomainDataService (ViewModel) loading an entity via a string nameDomainDataService (ViewModel) 通过字符串名称加载实体
【发布时间】:2013-01-03 16:01:02
【问题描述】:

所以我正在尝试动态加载我的域数据服务,其中表名是字符串......这是我到目前为止所得到的:通常我会像这样加载:

 theDomainDataService.Load(theDomainDataService.getUsersQuery());

所以我正在尝试通过字符串名称自动加载哪个实体。

 String theVariableEntityName = "Users";
 Type t = theDomainDataService.GetType();
 MethodInfo stuff = t.GetMethod("Get" + theVariableEntityName + "Query");
 var theQuery = stuff.Invoke(theDomainDataService, null);
 theDomainDataService.Load((EntityQuery<MySite.Web.Models.User>)theQuery);
  ---------------------------------------------------------^ Problem

这实际上是在正确加载我的 domainDataService,但我需要的是一种动态方式来推断 EntityQuery 的类型(无需明确声明它将成为用户),因为实际上它可以是任何东西。

我在 DomainDataService 类中尝试过这个,但没有成功,它没有找到方法的“Set”或“Entry”。

    public List<object> void PopulateEntity(string theEntityName)
    {
        Type theEntity = Type.GetType("MySiteMaintenance.Web.Models." + theEntityName);
        using (var db = new DatingEntities()) 
        {                        
              IQueryable query = db.Set(theEntity);
              foreach (var item in query) 
              {
                  var entry = db.Entry(item);
              }
        }
    }

记住,我需要的是一个填充的实体(当我只有实体的名称时)填充客户端......所以我可以说

 DomainServiceClass theClass = new DomainServiceClass();
 theClass.Load(theClass.GetEntityNameQuery());

所以我可以引用适当加载的实体... theClass.Entity(用户...问题等)

【问题讨论】:

  • 回想起来,这实际上是正确加载实体。但我需要一种方法来动态指定我的“类型”(MySite.Web.Models.User) 想法? :(
  • 可以从((TabItem)sender).Header推断出类型(例如:MySite.Web.Models.User)吗?还是作为参数传递?

标签: c# silverlight entity-framework reflection mvvm


【解决方案1】:

我仍然不确定我是否跟随,但是......

我的Sandbox 命名空间中有一个Post 实体,我使用字符串中的实体类型名称从我的DbContext 实例获取以开头...

                // Get my entity type (if in same assembly, else you'll have to specify)
                Type postType = Type.GetType("Sandbox.Post");

                using (var db = new StackOverflowEntities()) {                        

                    // not required
                    db.Configuration.ProxyCreationEnabled = false;

                    IQueryable query = db.Set(postType);
                    foreach (var item in query) {

                        DbEntityEntry entry = db.Entry(item);

                    }
                }

这会导致基于实体类型字符串检索任何 DbSet。在项目 foreach 循环中的断点下方 - 显示值。

【讨论】:

  • 找不到方法集。对于它的价值,我必须从域服务类运行此代码才能访问我的实体。
  • Set 方法不在您的 DbContext 派生类中。您使用的是哪个版本的 EF?
  • @QuintonBernhardt 我确实最终使用这种方法获得了相应的实体(我需要 EF 4.0 的 SP1 才能访问 DbContext)。但我真正想做的是加载实体这样它就可以通过客户端作为 ViewModel.Entity 使用......这有意义吗?
  • 不,恐怕我不这样做:/ 如果到客户端使用实体并且客户端知道预期类型时,则创建一个通用方法或属性来访问该值。如果没有,只返回类型对象并让客户端执行转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2019-06-25
相关资源
最近更新 更多