代码之家  ›  专栏  ›  技术社区  ›  TimothyP

为了使用RIA服务,我应该从模型中删除所有继承吗?

  •  0
  • TimothyP  · 技术社区  · 14 年前

    我以前已经发布过一些关于这个的问题,但它是不同的。

    因此,考虑一下我们模型的一小部分:

      • 顾客
      • 员工
      • 配偶

    Person是具有3个继承类的基类。

    这4个在我们的设计中非常重要,并与许多其他实体链接。 我可以通过删除RIA服务来解决我遇到的所有问题。 但这确实会增加模型的复杂性。

    我遇到的第一个问题是,我无法查询客户、员工或配偶,但有人给了我一个解决方案,就是向DomainService添加如下内容:

        public IQueryable<Employee> GetEmployees()
        {
            return this.ObjectContext.People.OfType<Employee>();
        }
    
        public IQueryable<Customer> GetCustomers()
        {
            return this.ObjectContext.People.OfType<Customer>();
        }
    
        public IQueryable<Spouse> GetSpouses()
        {
            return this.ObjectContext.People.OfType<Spouse>();            
        }
    

    接下来我尝试了一些对我来说很正常的方法:

    var employee = new Employee()
    {
        //.... left out to reduce the length of this question 
    };
    
    var spouse = new Spouse() 
    {
        //.... left out to reduce the length of this questions
    };
    
    employee.Spouse = spouse;
    
    context.People.Add(spouse);
    context.People.Add(employee);
    context.SubmitChanges();
    

    然后我得到以下异常:

    无法检索的实体集 派生实体类型“配偶”。使用 EntityContainer.GetEntitySet(类型)到 获取基本实体的实体集 类型“人”。

    即使配偶已经在数据库中, 我先检索它,得到了类似的例外。

    还请注意,由于某些原因,在某些地方使用“人”而不是“人”…

    那么我该怎么解决这个问题呢?我做错了什么? 当使用带有继承的RIA服务时,我会继续遇到困难吗?

    我在网上找到了一些参考资料,都说它有效,然后是一些域名服务 代码中,他们彻底改变了一些东西,但没有细节…

    我用的是VS2010 RC1+SilverLight 4

    注: 在所有混合会话中神奇工作的数据源窗口对我来说不起作用…它从不显示任何东西

    1 回复  |  直到 14 年前
        1
  •  2
  •   Ron Cain    14 年前

    这种行为是由于RC1中的错误造成的。详细讨论见 http://forums.silverlight.net/forums/p/169599/384514.aspx#384514 .

    没有已知的RC1解决方案,但您显示的层次结构在RC2中应该可以正常工作。这个bug以使用派生类型(EntityRef和EntityCollection)的关联为中心,所以我怀疑配偶关联是在您的场景中触发这个bug的原因。

    关于“人”和“人”——实体集的名称选择来源于EF对实体名称的复数形式。客户机上查询的名称来自于DomainService中相应的查询名称,这意味着您可以根据需要公开一个公共的IQueryable getPeople()。