Разоблачение связанных объектов в Ria Services SP1 и EF 4.1 POCO - PullRequest
2 голосов
/ 09 июня 2011

Недавно мы обновили приложение Silverlight 4, которое использовало RIA Services и EF 4.0 с EDMX, до RIA Services SP1 и EF 4.1 с использованием POCO. Обновление того стоило, но похоже, что RIA теперь играет по-другому с тем, как она выставляет ассоциированные объекты на клиенте.

Например, скажем, у нас есть следующие EOC 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; }
 }

Здание является родителем комнаты, а комната - родителем стола. Атрибут 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){}

}

На клиенте BuildingDomainContext, сгенерированный из BuildingDomainService, имеет три метода Exposed (GetBuildingsQuery (), GetRoomsQuery () и GetDesksQuery ()), но только один EntitySet типа Building, служба не предоставляет EntitySet для комнаты или стола.

В некоторых местах в нашем клиентском приложении мы хотим поддерживать эту иерархию объектов, но в других мы можем захотеть получить только ее часть, например, если мы хотим посмотреть и отредактировать столы в комнате, но не не заботятся о комнатах в здании. Поскольку RIA Services не предоставляет EntitySet для Room или Desk, мы не можем редактировать ни один из них, также не потянув за родительское здание.

Есть ли способ сохранить эти ассоциации в RIA, но также разрешить редактирование части этой иерархии без необходимости задействовать самого верхнего родителя?

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Я бы порекомендовал прочитать этот пост на состав .Когда вы добавляете атрибуты [Composition], это влияет на то, как данные передаются с сервера на клиент, а также на то, какие объекты вы можете редактировать независимо.

0 голосов
/ 09 июня 2011

Возможно, использование метода BuildingDomainContext.EntityContainer.GetEntitySet<Room>() предоставит вам EntitySet, который вы ищете.Вы можете поместить это в partial реализацию BuildingDomainContext на стороне клиента.Например:

public partial class BuildingDomainContext
{
    public EntitySet<Room> Rooms
    {
        get
        {
            return EntityContainer.GetEntitySet<Room>();
        }
    }
}
...