2

ASP.NET MVC 4SPAおよびEF5.0データベースの最初のセットアップを使用したdurandalプロジェクトでbreezejsを使用していますが、特定のシナリオを除いて正常に動作しています。

javascriptやSPAのことに関して、私がやや初心者のように思われる場合は、ご容赦ください。私は行くにつれて学んでいます。

これがEFの私の2つのモデルです

Project.cs

public partial class Project
{
        public Project()
        {
            this.Timesheets = new HashSet<Timesheet>();
        }

        public int ProjectId { get; set; }
        public Nullable<int> ClientId { get; set; }
        public string ProjectName { get; set; }
        public string ProjectDescription { get; set; }
        public Nullable<decimal> ProjectRate { get; set; }

        public virtual Client Client { get; set; }
        public virtual ICollection<Timesheet> Timesheets { get; set; }
}

Client.cs

public partial class Client
{
    public Client()
    {
        this.Projects = new HashSet<Project>();
        this.Timesheets = new HashSet<Timesheet>();
    }

    public int ClientId { get; set; }
    public string ClientNo { get; set; }
    public string ClientName { get; set; }
    public string CompanyName { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public string County { get; set; }
    public Nullable<decimal> ClientRate { get; set; }
    public string EmailAddress { get; set; }

    public virtual ICollection<Project> Projects { get; set; }
    public virtual ICollection<Timesheet> Timesheets { get; set; }
}

クライアントビューモデルからの抜粋

function deleteClient(model) {
    app.showMessage('Are you sure you want to DELETE this record?', 'Delete a Record', ['Yes', 'No'])
   .then(function (dialogresult) {
       if (dialogresult == "Yes") {
           models.remove(model);
           model.entityAspect.setDeleted();
           return saveRecord(model);
       }
   });
};

function saveRecord(model) {
    return repository.saveEntity(model)
    .fail(handleFailed);

    function handleFailed(error) {
        var err = "Error retrieving Clients : " + error.message;
        error(err);
        logger.error(err, null, null, true);
        return;
    }
};

repository.jsからの抜粋(datacontext)

function saveEntity(masterEntity) {
    return manager.saveChanges().fail(saveFailed);

    function saveFailed(error) {
            logger.error("Error saving : " + error.message, null, null, true);
    }
}

これが私のProjectBillingController.csからの抜粋です

   [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }

これが私のシナリオです、

クライアント「ABC」への参照を持つ行プロジェクト「P1」があります。クライアント「ABC」を削除しようとすると、WEBAPIコントローラー「ProjectBillingController.cs」のSaveChanges内でそよ風が例外をスローします。

SQLの世界では、これが予想されるエラーになるはずです。

しかし、私の質問は...

  • サーバー「ProjectBillingController.cs」に到達する前に、クライアント側でこの制約エラーをキャプチャできますか?
  • この問題を解決する唯一の方法は、別のクエリを実行して、そのクライアントのProjectエンティティに行があるかどうかを確認し、ある場合は削除を停止し、そうでない場合は削除を続行することです。これを達成する別の方法はありますか?
  • この「検証ロジック」をビューモデルまたはデータコンテンツ(リポジトリ)内に記述する必要があります
4

2 に答える 2

1

Project のテーブル プロパティでは、Client との FK リレーションが必要ですよね? この関係では、削除ルールを CASCADE に設定する必要があります (クライアントを削除すると、クライアントの関連プロジェクトがすべて削除されることに注意してください)。

1. Visual Studio で、サーバー エクスプローラーを確認します。 2. テーブル [プロジェクト] を右クリックします。 3. [テーブル プロパティ] を選択します。

削除ルールに関して私が言及したことを確認し、それに応じて変更してください。

ティアゴ

于 2013-03-15T22:35:39.240 に答える
1

親を削除すると、子に関連するエンティティに削除をカスケードする必要があることをクライアントで検出する方法があるとは思いません。サーバーを呼び出す前に「エラー」をキャッチすることはできません。以下で説明するように、クライアントで補正できます。

データベース(および/またはEF)を自動的にカスケード削除するように構成するというTiagoの提案を好むと思います。

それが不可能な場合は、クライアントまたはサーバーでプログラムによって処理できます。子エンティティ (またはそのキーのみ) をダウンロードし、親を削除するときにクライアントでそれらを削除できます。または、コントローラーのサーバー上で同じことができます (または、サーバー上のヘルパー クラスではるかに優れています)。これらは、場合によっては必要になる、より面倒な代替手段です。

クライアントでロジックを記述する場合は、「datacontext」で行ってください。これは ViewModel の問題ではありません。

FWIW、これを「検証ロジック」とは呼びません。データを検証していません。検証ロジックがデータを変更することはありません。データが有効か無効かのみを発音できます。

親が削除された場合、この親 EntityType のインスタンスの子も削除する必要があるというビジネス モデル ルールに従ってデータを操作しています。この規則について、本質的に明らかなことは何もありません。スキーマの観点から、「色」は製品タイプの「親」です。これは、製品と 1 対多の関係があるためです。しかし、「赤」という色を削除した場合、すべての赤の製品が自動的に削除されることは望ましくありません。カスケード削除は本質的に危険であるため、それをサポートするようにサーバー コンポーネントを構成する必要があります。

削除は厄介なビジネスです。個人的には、可能であればアプリでの削除を避け、代わりに何らかの形式のソフト削除を使用しています。それが常に選択肢であるとは限らないことを認めます。

于 2013-03-15T23:31:55.693 に答える