【发布时间】:2012-06-13 04:42:35
【问题描述】:
我正在编写一个使用现有数据库的应用程序,该数据库有一些表我根本无法修改,但我仍然可以添加新表。 因此,假设我有一个旧表 Cities,我可以对其进行读取、创建、更新和删除,但我无法修改架构。 然后,我添加了一个新表 Clients,它具有 Cities 的外键,但我无法在数据库服务器 (SQL SERVER 2008) 上添加关系,因为它还修改了 Cities 表,添加了关系。 所以我想也许如果我将它们都添加到我的 linq-to-sql 上下文中,并在那里添加关系,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
知道是否可以强制参照完整性?还是在数据库上添加关系是唯一的方法?
【问题讨论】:
-
如果可以添加新表,也可以添加触发器。这是一种管理参照完整性的糟糕方法,但它会起作用......
-
我可以添加。也许这是一个解决方案......我需要强制这些错误,因为我继承了系统,现在我需要维护它,但它几乎不检查参照完整性,并允许用户删除她想要的任何东西......我只是想确保它不会破坏数据库的完整性。
-
@RaphaëlAlthaus 您需要在引用的表 Cities 上使用触发器,以检查删除该城市后是否存在客户端。他的前提是他不能修改 Cities 模式。
-
你需要“维护系统”,所以可以修改,但是不能修改数据库?这是否意味着数据库不“属于”系统?也就是说,其他系统也在修改数据?在这种情况下,您在客户端上所做的任何事情都不会阻止其他系统更改数据(例如删除城市)。如果您拥有系统,包括数据库,请添加外键关系。
-
@KrisVandermotten 你是对的。我认为......但这并不是那么清楚:指向另一个模式的 FK 将如何“改变”该模式?它可能会导致指向此架构的其他应用程序发生更改(“为什么我不能删除那个城市”),当然,但与 DB 无关,不是吗?如果权利没问题...
标签: c# sql-server-2008 linq-to-sql