c# - 公开 Ria 服务 SP1 和 EF 4.1 POCO 中的关联实体

标签 c# entity-framework-4.1 wcf-ria-services

我们最近将使用 RIA 服务和带有 EDMX 的 EF 4.0 的 Silverlight 4 应用程序升级到使用 POCO 的 RIA 服务 SP1 和 EF 4.1。这次升级非常值得,但 RIA 现在在客户端上公开关联实体的方式似乎有所不同。

例如,假设我们有以下 EF POCO,它们也是我们的 RIA 实体:

public class Building
{
   public Building()
   {
     Rooms = new List<Room>();
   }

   [Key]
   public int? BuildingID { get; set; }

   public string Name {get; set;}

   [Association("Building_1-*_Rooms", "BuildingID", "BuildingID")]
   [Include]
   [Composition]
   public ICollection<Room> Rooms {get; set;}
}


public class Room
{
   [Key]
   public int? RoomID { get; set; }

   [Required]
   public int? BuildingID { get; set; }

   public string Name {get; set;}

   [Association("Building_1-*_Rooms", "BuildingID", "BuildingID", IsForeignKey= true)]
   [Include]
   public Building Building {get; set;}

   [Association("Room_1-*_Desks", "RoomID", "RoomID")]
   [Include]
   [Composition]
   public ICollection<Desk> Desks { get; set; }
}

public class Desk
{
   [Key]
   public int? DeskID { get; set; }

   [Required]
   public int? RoomID { get; set; }

   public string Name { get; set; }

   [Association("Room_1-*_Desks", "RoomID", "RoomID", IsForeignKey = true)]
   [Include]
   public Room Room { get; set; }
 }

Building 是 Room 的父级,Room 是 Desk 的父级。 Association 属性定义 RIA 的这些关系。然后,我们通过一个简单的服务公开这些实体,该服务为所有三个实体提供 CRUD

public class BuildingDomainService
{

 var _context= new BuildingEFContext(); //Lets just say this is our EF Context that has all three types on it

 public IQueryable<Buildings> GetBuildings()
 {
      return _context.Buildings.Include(x => x.Rooms.Select(y => y.Desks));
 }

 public IQueryable<Rooms> GetRooms()
 {
      return _context.Rooms.Include(x => x.Desks);
 }

 public IQueryable<Desk> GetDesks()
 {
      return _context.Desks;
 }

 //Empty Update and Insert Methods to allow editing on client
 public void UpdateBuilding(Building building){}
 public void InsertBuilding(Building building){}
 public void DeleteBuilding(Building building){}

 public void UpdateRoom(Room room){}
 public void InsertRoom(Room room){}
 public void DeleteRoom(Room room){}

 public void UpdateDesk(Desk desk){}
 public void InsertDesk (Desk desk){}
 public void DeleteDesk (Desk desk){}

}

在客户端上,从 BuildingDomainService 生成的 BuildingDomainContext 具有三个公开方法(GetBuildingsQuery()、GetRoomsQuery() 和 GetDesksQuery()),但只有一个 Building 类型的 EntitySet,该服务不公开 EntitySet用于房间或办公 table 。

在我们的客户端应用程序中的某些地方,我们希望维护此对象层次结构,但在其他地方,我们可能只想获取其中的一部分,例如,如果我们想查看和编辑房间中的 table ,但不这样做不关心建筑物中的房间。由于 RIA 服务不会公开 Room 或 Desk 的 EntitySet,因此我们无法在不拉动父建筑物的情况下编辑其中任何一个。

是否有办法在 RIA 中维护这些关联,同时还允许编辑此层次结构的一部分,而不必拉入最顶层的父级?

最佳答案

我建议阅读 composition 上的这篇文章。当您添加[组合]属性时,它会影响数据从服务器到客户端的流动方式以及您可以独立编辑的实体。

关于c# - 公开 Ria 服务 SP1 和 EF 4.1 POCO 中的关联实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6286611/

相关文章:

c# - EnvDTE 从 CodeElement 中检索数据类型

c# - 从数据存储中检索 key (更新和删除实体)

c# - Java通过反射创建通用Arraylist

ef-code-first - EF4.1 CodeFirst : Add field to join table

.net - ChangeTracker Entity Framework 4.1-相关对象的原始值

silverlight - 使用 WCF RIA Services SP1 如何通过 Entity Framework 复杂类型使用存储过程?

c# - Convert.ToBase64String 是否返回与其源字节数组相同的长度?

c# - Entity Framework 代码优先 - 无法在对象 'db' 中插入重复键

silverlight - 是否可以在没有IIS的情况下使用Silverlight RiaServices?

Silverlight 4 WCF RIA 服务和 MVVM 没有那么简单