1

私は単純なオブジェクト モデル public class License {

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [ScaffoldColumn(false), StringLength(20)]
    public string CreationUserId { get; set; }

    [ScaffoldColumn(false), StringLength(20)]
    public string LastModifiedUserId { get; set; }

    public string LicenseName { get; set; }

    public LicenseType LicenseType { get; set; }

    public State State { get; set; }

    public DateTime DateIssued { get; set; }

    public int ValidFor { get; set; }


}

public class State
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [ScaffoldColumn(false), StringLength(20)]
    public string CreationUserId { get; set; }

    [ScaffoldColumn(false), StringLength(20)]
    public string LastModifiedUserId { get; set; }

    [StringLength(2)]
    [Required]
    public string Name { get; set; }

    [Display(Name = "Long Name")]
    [Required, StringLength(25)]
    public string LongName { get; set; }
}

public class LicenseType
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [ScaffoldColumn(false), StringLength(20)]
    public string CreationUserId { get; set; }

    [ScaffoldColumn(false), StringLength(20)]
    public string LastModifiedUserId { get; set; }

    [StringLength(100), Required]
    public string Description { get; set; }
}

ホットタオルのテンプレートはbreeze、durandal、knockoutを使用しています。私は単純な追加ビューモデルを持っています

var _licenseAdded = false;
var vm = {

    states: ko.observableArray(context.states),
    licenseTypes: ko.observableArray(context.licenseTypes),

    viewAttached: function () {
        var self = this;
        $('input[name^="date"]').datepicker();
        $('#validFor').spinner({
            min: 365,
            max: 3650,
            step: 30
        });
        log('add Attached', null, true);

    },

    activate: function () {
        var self = this;
        self.original = context.manager.createEntity('License', { licenseName: 'Testing321', dateIssued: moment().format('L') }, null);
        log('add Activated', null, true);


    },
    canDeactivate: function () {
        if (_licenseAdded === false) {
            return app.showMessage('Are you sure you want to leave this page?', 'Navigate', ['Yes', 'No']);
        } else {
            return true;
        }
    },
    saveChanges: function () {

        $.when(context.saveNewLicense()).done(function () {
            _licenseAdded = true;

        });
        router.navigateTo('home');
    },
    original: undefined

};
return vm;

そして、これが私のadd.htmlです。すべてが正常にバインドされ、保存するまで美しく機能します。

saveChanges を呼び出すと、コントローラに送信された saveBundle には、正しい State と LicenseType を保存できるようにするナビゲーション プロパティが添付されていません。 , "LastModifiedUserId": null, "LicenseName": "テスト用の新規", "DateIssued": "2013-03-11T04:00:00Z", "ValidFor": 0, "entityAspect": { "entityTypeName": "ライセンス:#Volt.Telecom.Licensing.Models", "entityState": "追加", "originalValuesMap": {}, "autoGeneratedKey": { "propertyName": "Id", "autoGeneratedKeyType": "Identity" } } ], "saveOptions": { "allowConcurrentSaves": false } }

これ以上のバニラを手に入れることができるとは思わない. なぜこのようなことが起こるのでしょうか? クライアントでデバッグしているとき、状態と licenseType のナビゲーション プロパティはすべて正しく、正しい値になっています。

4

1 に答える 1

0

問題は、EF モデルが「外部キー アソシエーション」ではなく「独立アソシエーション」を使用していることだと思います (外部キー アソシエーションは EF のデフォルトです)。この仮定をより適切に文書化する必要があります。

この要件はバイパスできますが、機能が大幅に失われますが、クライアントに外部キーが存在することで、個別にクエリされる可能性のあるエンティティ間の関係を簡単に修正できるようになるためです。

詳細な背景については、次の MSDN 記事を参照してください: Foreign-keys-in-the-entity-framework

于 2013-03-05T01:00:07.033 に答える