2

既存のデータベースを使用するアプリをコーディングしています。そのデータベースにはまったく変更できないテーブルがいくつかありますが、それでも新しいテーブルを追加できます。たとえば、Cities という古いテーブルがあるとします。このテーブルの読み取り、作成、更新、および削除はできますが、スキーマを変更することはできません。次に、Cities への外部キーを持つ新しいテーブル Clients を追加しますが、Cities テーブルも変更してリレーションを追加するため、データベース サーバー (SQL SERVER 2008) にリレーションを追加できません。したがって、両方を linq-to-sql コンテキストに追加し、そこに関係を追加すると、linq-to-sql は、関係が確立されていなくても、参照整合性をチェックするのに十分賢いと思いました。データベース、それはコンテキストにあります。

それを試すために新しいプロジェクトを作成し、リレーションのない 2 つの単純なテーブルを追加してから、linq-to-sql デザイナーにリレーションを追加し、参照整合性の例外を強制しようとしましたが、機能していないようです。

DBContextDataContext db = new DBContextDataContext();

City l = new City();
l.name= "Buenos Aires";
db.Cities.InsertOnSubmit(l);

Client c = new Client();
c.name = "Mike";
c.City = l;
db.Clients.InsertOnSubmit(c);

db.SubmitChanges(); // This works

db.Cities.DeleteOnSubmit(l); 
db.SubmitChanges(); // This shouldn't work, but it works

参照整合性を強制することが可能かどうか、何か考えはありますか? または、DB にリレーションを追加することが唯一の方法ですか?

4

1 に答える 1

1

DataContex で SubmitChanges メソッドをオーバーライドし、加えられた変更を確認できます。

    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
    {
        bool everythingIsOK = true;

        var changes = GetChangeSet();
        var inserts = changes.Inserts;
        var deletes = changes.Deletes;
        var updates = changes.Updates;

        //verify everything is valid
        //...

        //if you need to, you can get the original state of the updated objects like this:
        foreach(object x in updates) {
            var original = this.GetTable(x.GetType()).GetOriginalEntityState(x);
            //verify the change doesn't break anything
            //...
        }

        if(everythingIsOK){ base.SubmitChanges(failureMode); }
    }

でも痛い感じ。DBA と話して必要な変更を行うことはできないと確信していますか? テーブルを追加することはできますが(許可されていると思います)、外部キーを追加できないため、データベースに無効なデータが含まれている可能性がありますか?

また、この方法で変更を確認する必要がある場合は、データベースに対してさらにクエリを実行して、すべてのキーなどが有効であることを確認する必要があります。

または、これは間違いなくハックです:

  • 自分用に db スキーマのスクリプトを作成する
  • マシン上、または必要な場所にデータベースを再作成します
  • 新しいテーブルを追加し、データベースに外部キーを追加します
  • ローカルの変更されたデータベースから linq スキーマを生成します
  • 接続文字列を実際のものに変更します

そして非常に壊れやすい:元のデータベースで何かが変更された場合、「ダミー」データベースで変更する必要があります...

それでも、上司、DBA、またはこの決定を下した人に理由を説明してみてください。参照されているテーブルで他の誰かが削除するのを防ぐことはできないからです。

于 2012-06-12T20:35:05.930 に答える