1

Breeze は TPH エンティティを正しく展開しません。TPH を使用している場合、Expand in Breeze を使用する場合、Expand は最初のエンティティに対してのみ機能し、他のプロパティは null になります。継承を使用しないようにエンティティを変更すると、正常に動作します。また、正常に機能する展開クエリで各エンティティを個別に返すこともテストしました。

// クライアント側のコード

        var getResidentById = function (id, obs) {

            var query = EntityQuery.from('Residents')
                .where('id', '==', id)
                .expand('user, currentUnit, leases, leases.unit, leases.leaseStatus');

            return manager.executeQuery(query).then(function (data) {
                if (obs) {
                    obs(data.results[0])
                }
            }, queryFailed);
        };

//コントローラーエンドポイント

[HttpGet]
public IQueryable<Resident> 
{
   return _context.Context.UserDetails.OfType<Resident>();
}

//モデル

public class UserDetail : EntityBase<int>, IArchivable, IHasPhoto, IDeactivatableEntity, IUpdatable
    {
        public bool IsArchived { get; set; }
        public int LastUpdatedById { get; set; }
        public UserProfile LastUpdatedBy { get; set; }
        public DateTimeOffset LastUpdatedDate { get; set; }
        public string PhotoUri { get; set; }
        public bool IsInactive { get; set; }
    }

    public abstract class UserBelongsToApartmentComplex : UserDetail, IBelongsToApartmentComplex
    {

        public int ApartmentComplexId { get; set; }
        public virtual ApartmentComplex ApartmentComplex { get; set; }

        public virtual bool IsInSameComplexAs(IRelatedToApartmentComplex otherEntity)
        {
            return ApartmentComplexId == otherEntity.ApartmentComplexId;
        }
    }

    public class Staff : UserBelongsToApartmentComplex
    {
        public string Title { get; set; }
    }

    public class Admin : UserDetail
    {
        public string AccessLevel { get; set; }
    }

    public class Resident : UserBelongsToApartmentComplex
    {
        public string Pets { get; set; }
        public bool HasInsurance { get; set; }
        public virtual IList<Lease> Leases { get; set; }
        public int? CurrentUnitId { get; set; }
        public virtual Unit CurrentUnit { get; set; }

        public Resident()
        {
            Leases = new List<Lease>();
        }
    }

//エンドポイントからのサーバーからの応答データ public IQueryable Residents()

[{"$id":"1","$type":"RadiusBlue.Core.Models.Resident, RadiusBlue.Core","Pets":"Sadie, a westie","HasInsurance":false,"Leases":[{"$id":"2","$type":"RadiusBlue.Core.Models.Lease, RadiusBlue.Core","Start":"2012-05-23T00:00:00.000","End":"2013-05-23T00:00:00.000","UnitId":2,"Unit":{"$id":"3","$type":"RadiusBlue.Core.Models.Unit, RadiusBlue.Core","Building":"B","Floor":2,"ModelName":"Tera","RentAmount":2500.00,"NumberOfBeds":1,"NumberOfBaths":3,"UnitName":"102A","IsInactive":true,"Inhabitants":[],"ApartmentComplexId":1,"ApartmentComplex":{"$id":"4","$type":"RadiusBlue.Core.Models.ApartmentComplex, RadiusBlue.Core","Name":"The Stratford","StreetAddress":"100 S Park Ave","City":"Winter Park","StateId":10,"ZipCode":"32792","PropertyManagementCompanyId":1,"IsInactive":false,"TimeZoneId":"Eastern Standard Time","TimeZone":{"$id":"5","$type":"System.TimeZoneInfo, mscorlib","Id":"Eastern Standard Time","DisplayName":"(UTC-05:00) Eastern Time (US & Canada)","StandardName":"Eastern Standard Time","DaylightName":"Eastern Daylight Time","BaseUtcOffset":"-PT5H","AdjustmentRules":[{"$id":"6","$type":"System.TimeZoneInfo+AdjustmentRule, mscorlib","DateStart":"0001-01-01T00:00:00.000","DateEnd":"2006-12-31T00:00:00.000","DaylightDelta":"PT1H","DaylightTransitionStart":{"$id":"7","$type":"System.TimeZoneInfo+TransitionTime, mscorlib","TimeOfDay":"0001-01-01T02:00:00.000","Month":4,"Week":1,"Day":1,"DayOfWeek":"Sunday","IsFixedDateRule":false},"DaylightTransitionEnd":{"$id":"8","$type":"System.TimeZoneInfo+TransitionTime, mscorlib","TimeOfDay":"0001-01-01T02:00:00.000","Month":10,"Week":5,"Day":1,"DayOfWeek":"Sunday","IsFixedDateRule":false}},{"$id":"9","$type":"System.TimeZoneInfo+AdjustmentRule, mscorlib","DateStart":"2007-01-01T00:00:00.000","DateEnd":"9999-12-31T00:00:00.000","DaylightDelta":"PT1H","DaylightTransitionStart":{"$id":"10","$type":"System.TimeZoneInfo+TransitionTime, mscorlib","TimeOfDay":"0001-01-01T02:00:00.000","Month":3,"Week":2,"Day":1,"DayOfWeek":"Sunday","IsFixedDateRule":false},"DaylightTransitionEnd":{"$id":"11","$type":"System.TimeZoneInfo+TransitionTime, mscorlib","TimeOfDay":"0001-01-01T02:00:00.000","Month":11,"Week":1,"Day":1,"DayOfWeek":"Sunday","IsFixedDateRule":false}}],"SupportsDaylightSavingTime":true},"Users":[{"$ref":"1"}],"Groups":[],"IsArchived":false,"ApartmentComplexId":1,"Id":1},"Id":2},"ResidentId":3,"Resident":{"$ref":"1"},"LeaseStatusId":4,"LeaseStatus":{"$id":"12","$type":"RadiusBlue.Core.Models.LeaseStatus, RadiusBlue.Core","Description":"Lost","Id":4},"Id":1},{"$id":"13","$type":"RadiusBlue.Core.Models.Lease, RadiusBlue.Core","Start":"2013-05-24T00:00:00.000","End":"2014-05-24T00:00:00.000","UnitId":1,"Unit":{"$id":"14","$type":"RadiusBlue.Core.Models.Unit, RadiusBlue.Core","Building":"A","Floor":2,"ModelName":"Aqua","RentAmount":2000.00,"NumberOfBeds":2,"NumberOfBaths":1,"UnitName":"101A","IsInactive":true,"Inhabitants":[{"$ref":"1"}],"ApartmentComplexId":1,"ApartmentComplex":{"$ref":"4"},"Id":1},"ResidentId":3,"Resident":{"$ref":"1"},"LeaseStatusId":1,"LeaseStatus":{"$id":"15","$type":"RadiusBlue.Core.Models.LeaseStatus, RadiusBlue.Core","Description":"Active","Id":1},"Id":2}],"CurrentUnitId":1,"CurrentUnit":{"$ref":"14"},"ApartmentComplexId":1,"ApartmentComplex":{"$ref":"4"},"Id":3,"User":{"$id":"16","$type":"RadiusBlue.Core.Models.UserProfile, RadiusBlue.Core","UserName":"vjiawon@gmail.com","FirstName":"Vishal","LastName":"Jiawon","Age":27,"PhoneNumber":"123 456 7890","IsInactive":false,"UserDetail":{"$ref":"1"},"GroupMembers":[],"MaintenanceRequests":[],"Id":3},"IsArchived":false,"LastUpdatedById":1,"LastUpdatedDate":"0001-01-01T00:00:00.000+00:00","IsInactive":false,"CreatedById":1,"CreatedDate":"0001-01-01T00:00:00.000+00:00"}]
4

1 に答える 1

0

BreezeJS のどこかにバグがあることは間違いありません。

少なくとも v.1.3.4 の時点では、Breeze は TPH クラスの複数のナビゲーション プロパティを展開できることを報告できます...返される最初のエンティティだけではありません

DocCode のinheritanceTests.jsの " can navigate to AccountTypeeagerly loaded with expand " テストを変更して、(a) ナビゲーションも展開し、(b) 1 番目ではなく返された 3 番目のエンティティでテストが実行されるようにしました。Status

クエリは次のようなものです。

var em = newEm(); // クリーンで空の EntityManager
return EntityQuery.from('bankRootTPHs').take(3)
    .expand('アカウントの種類、ステータス'))
    .using(em).execute().then(success).fail(handleFail);

...
関数の成功(データ) {
    var エンティティ = data.results[data.results.length-1]; // 最後のもの (3 番目) を取得します
    var タイプ = data.query.entityType.shortName;

    if (!エンティティ) {
        ok(false, "クエリが 1 つの " + タイプを返すことができませんでした);

    }
    // さらにテスト
    // ブレークポイントを設定して検査しました
    // entity.accountType() および entity.status()
    // どちらも予想される関連エンティティを返しました

}

AccountType関連と関連の両方Statusがエンティティから利用できることがわかります。

だから、何か他のことが間違っています。

あなたの例に関する質問

まず、あなたがたくさんの展開を持っていることを確認せざるを得ません。私は5つの関連エンティティを数えます。これにより、パフォーマンスが低下する可能性があります。私たちはそれについて話しているわけではないことを知っていますが、私はそれを呼びかけています.

第 2 に、スーパー クラスUserDetailは具体的ですが、中間の派生クラスUserBelongsToApartmentComplexは抽象的です。具体的/抽象的/具体的な継承クラス階層があります。照会されたタイプResidentsは、そのようなクラスの 1 つです。そして、すべてのレベルのクラスが「UserDetail」テーブルにマップされますね。

私たちはそのシナリオをテストしなかったと確信しています...これはかなり珍しいことです. それが機能するかどうかさえわかりませんでした!今のところ、EF がそのような構成を許可しているというあなたの言葉を受け入れる必要があります。

BreezeJS はそれについて混乱しているようです。見てみましょう。

于 2013-05-24T21:19:43.947 に答える