繁体   English   中英

不带数据库的Linq to SQL引用完整性

[英]Linq to SQL Referential Integrity without database

我正在编写一个使用现有数据库的应用程序,该数据库包含一些我根本无法修改的表,但是我仍然可以添加新表。 因此,假设我有一个旧表Cities,可以读取,创建,更新和删除该表,但无法修改该架构。 然后,我添加一个新表Clients,该表具有指向Cities的外键,但是无法在数据库服务器(SQL SERVER 2008)上添加关系,因为它还会修改Cities表并添加一个关系。 所以我想,也许如果将它们都添加到linq-to-sql上下文中并在其中添加关系,即使未在数据库,它在上下文中。

我创建了一个新项目来进行尝试,我添加了两个没有关系的简单表,然后在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

是否有可能强制参照完整性? 还是在数据库上添加关系是唯一的方法?

您可以重写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进行必要的更改? 您可以(我想也可以)添加表,但不能添加外键,因此数据库可能包含无效数据?

另外,如果必须以这种方式验证更改,则意味着必须对数据库进行更多查询以验证所有键等是否有效。

或者这绝对是一个hack:

  • 为自己编写数据库模式脚本
  • 在您的机器上或任何您想要的地方重新创建数据库
  • 添加新表,并将外键添加到数据库
  • 从本地修改的数据库生成linq模式
  • 将连接字符串更改为真实的

而且非常脆弱:如果原始数据库中有任何更改,则必须在“虚拟”数据库中进行更改...

因此,仍然尝试与您的老板,DBA或做出此决定的人进行推理,因为您无法阻止其他人在引用表中进行删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM