На этот раз у меня вопрос по пустякам :)
Почему ветерок не соединяет связанные объекты. Соответствующие данные возвращаются методом репозитория на сервере. Вы видите, что из моих данных скрипача клиент получает данные.
Насколько я понимаю, вам не нужно вручную вызывать метод «расширить» в запросе на стороне клиента, если данные возвращаются с сервера.
Объектные отношения
1) Элемент может иметь много Единиц 2) Единица может относиться ко многим Элементам
Скопировано из документации Breezejs.com
Исключение свойств навигации Иногда требуется исключить свойство навигации на одной стороне ассоциации. Например, у вас может быть Person.Gender, но вам не нужен Gender.Persons; нет веских причин для перехода от гендерной сущности «Мужской» ко всем лицам мужского пола и нет причин нести накладные расходы на обновление наблюдаемого массива для этой навигации. К счастью, вы можете опустить свойство навигации на главной стороне ассоциации. Пол является основным в этом примере, поэтому вы можете опустить Gender.Persons.
--СТРУКТУРА ТАБЛИЦ БД
CREATE TABLE [dbo].[Item](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[DisplayOrder] [int] NOT NULL
)
CREATE TABLE [dbo].[Unit](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Acronym] [varchar](10) NULL,
[Name] [varchar](50) NULL,
[DisplayOrder] [int] NULL
)
CREATE TABLE [dbo].[AvailableUnit](
[ItemId] [int] NOT NULL,
[UnitId] [int] NOT NULL,
CONSTRAINT [PK_AvailableUnit] PRIMARY KEY CLUSTERED
([ItemId] ASC,[UnitId] ASC
)
-- Карты EF 6
public class ItemMap : EntityTypeConfiguration<Item> {
public ItemMap ( ) {
ToTable( "Item" );
HasKey( k => new { k.Id } );
Property( p => p.Id ).HasColumnName( "Id" );
Property( p => p.Name ).HasColumnName( "Name" ).HasMaxLength( 50 );
Property( p => p.DisplayOrder ).HasColumnName( "DisplayOrder" );
HasMany( t => t.Units )
.WithMany( )
.Map( m => {
m.ToTable( "AvailableUnit" );
m.MapLeftKey( "ItemId" );
m.MapRightKey( "UnitId" );
} );
}
}
public class UnitMap : EntityTypeConfiguration<Unit> {
public UnitMap( ) {
ToTable( "Unit" );
HasKey( k => new { k.Id } );
Property( p => p.Id ).HasColumnName( "Id" );
Property( p => p.Acronym ).HasColumnName( "Acronym" ).HasMaxLength(10).IsRequired();
Property( p => p.Name ).HasColumnName( "Name" ).HasMaxLength( 50 );
Property( p => p.DisplayOrder ).HasColumnName( "DisplayOrder" );
}
}
-- Пример класса
public class Item {
public int Id { get; set; }
public string Name { get; set; }
public int? DisplayOrder { get; set; }
public virtual List<Unit> Units { get; set; }
public Item( ) { }
}
public class Unit {
public int Id { get; set; }
public string Acronym { get; set; }
public string Name { get; set; }
public int? DisplayOrder { get; set; }
public Unit() { }
}
--- Метод репозитория
public IQueryable<Items> Items {
get {
return Context.Items
.Include( i => i.Units );
}
}
---- JSON ОТ FIDDLER
[
{
"$id": "1",
"$type": "MyProject.Core.Item, MyProject.Core",
"Id": 1,
"Name": "Alprostadil",
"Units": [
{
"$id": "8",
"$type": "MyProject.Core.Unit, MyProject.Core",
"Id": 1,
"Acronym": "U1",
"Name": "Unit 1",
"DisplayOrder": 10
},
{
"$id": "9",
"$type": "MyProject.Core.Unit, MyProject.Core",
"Id": 2,
"Acronym": "U2",
"Name": "Unit 2",
"DisplayOrder": 20
},
{
"$id": "10",
"$type": "MyProject.Core.Unit, MyProject.Core",
"Id": 3,
"Acronym": "U3",
"Name": "Unit 3",
"DisplayOrder": 30
},
{
"$id": "11",
"$type": "MyProject.Core.Unit, MyProject.Core",
"Id": 4,
"Acronym": "U4",
"Name": "Unit 4",
"DisplayOrder": 40
}
],
"DisplayOrder": 10
}
]
-- Методы Hot Towel из Abstract Repository
function _getById(entityName, id, forceRemote) {
var self = this;
var manager = self.manager;
if (!forceRemote) {
// check cache first
var entity = manager.getEntityByKey(entityName, id);
if (entity && !entity.isPartial) {
self.log('Retrieved [' + entityName + '] id:' + entity.id + ' from cache.', entity, true);
if (entity.entityAspect.entityState.isDeleted()) {
entity = null; // hide session marked-for-delete
}
return $q.when(entity);
}
}
// Hit the server
// It was not found in cache, so let's query for it.
return manager.fetchEntityByKey(entityName, id)
.to$q(querySucceeded, self._queryFailed);
function querySucceeded(data) {
entity = data.entity;
if (!entity) {
self.log('Could not find [' + entityName + '] id:' + id, null, true);
return null;
}
entity.isPartial = false;
self.log('Retrieved [' + entityName + '] id ' + entity.id
+ ' from remote data source', entity, true);
self.zStorage.save();
return entity;
}
}