Недавно мы обновили приложение 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, но также разрешить редактирование части этой иерархии без необходимости задействовать самого верхнего родителя?