关于架构的一个问题
数据库里有3个表,我在数据层(DAL层)里建3个类,一个类对应一个表,每个类负责进行对相应的表的读和写!但是有的时候一个操作可能要同时向两个表或者三个表里写入数据或读出数据!这样的话怎么解决!
不知道我说清楚了没有!不懂的话我再解释!
谢谢!
[解决办法]
那你就把涉及到3个表的操作封装成一个类 不就OK了嘛...
[解决办法]
友情帮顶~
[解决办法]
一般情况是对 该类封装的这个表做操作
操作无非就是增 删 查改
通常是用存储过程来实现
设计到多表的可以写个视图 然后用存储过程来处理视图
[解决办法]
用视图啊。
如果对数据的操作不复杂的话就把那几个类一一实例化,然后分别操作也可以。
[解决办法]
数据访问层是提供数据的,并不能要求以个类严格对应一个表。因为无可避免的要进行多表操作。。我们常常会把关联关系的对象封装在一起,比如果有个 学生表和成绩表,有时候我们需要读出一个学生的成绩。那我们可以在学生对象添加一个属性叫成绩。在DAL层把属性填充。总之,表和数据访问的类不是严格对应,不能说一个类仅仅只有操作一个表的职能。
[解决办法]
用事务吧。如果三个表一起操作时,如果有一个表没有操作成功,就会回滚。反之就是都成功了。
我个人觉得这样比较保险点。
[解决办法]
用事务或触发器来求得几个表的连动
[解决办法]
其实像关于数据库的有些问题,你发布到数据库版块,也许会得到更想要的答案
[解决办法]
{
//Register for the transaction completed event for the current transaction
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(Current_TransactionCompleted);
//Call complete on the TransactionScope based on console input
ConsoleKeyInfo c;
while (true)
{
Console.Write("Complete the transaction scope? [Y|N] ");
c = Console.ReadKey();
Console.WriteLine();
if ((c.KeyChar == 'Y') || (c.KeyChar == 'y'))
{
scope.Complete();
break;
}
else if ((c.KeyChar == 'N') || (c.KeyChar == 'n'))
{
break;
}
}
}
}
catch (System.Transactions.TransactionException ex)
{
Console.WriteLine(ex);
}
catch
{
Console.WriteLine("Cannot complete transaction");
throw;
}
}
//Transaction completed event handler
static void Current_TransactionCompleted(object sender, TransactionEventArgs e)
{
Console.WriteLine("A transaction has completed:");
Console.WriteLine("ID: {0}", e.Transaction.TransactionInformation.LocalIdentifier);
Console.WriteLine("Distributed ID: {0}", e.Transaction.TransactionInformation.DistributedIdentifier);
Console.WriteLine("Status: {0}", e.Transaction.TransactionInformation.Status);
Console.WriteLine("IsolationLevel: {0}", e.Transaction.IsolationLevel);
}
[解决办法]
一个操作也可以分几步进行的,分别调几个存储过程
[解决办法]
用事务
可以使用c#的事务处理,也可以用存储过程的事务处理
这个就随便你了
还有你所谓的架构问题,是谁触发就放哪个类里就可以了;
例如:你是先更新A表,然后需要更新B表;那么你这个方法就放在处理A表的类中
[解决办法]
c#的事务处理是指“ADO.net中的事务处理”
具体你可以GOOGLE一下
[解决办法]
orm或实体类,并非说一个表一个类,一个表一个实体
一个表一个实体,这种理解过于狭隘了
好了,我饿了,我现在想吃“青椒肉丝”,哦,“青椒”是“青椒”,“肉丝”是“肉丝”,他们怎么跑一块去了。
负责配菜的师傅呢?
好了,分清楚你的职责。
业务逻辑--大师傅---就负责炒菜,处理味道和火候
数据逻辑--打下手的--配菜,配调料,偶尔帮助大师傅看着火候
数据库---后勤,帮工---采购,洗菜,切菜
[解决办法]
在某个类里面定义一个方法,执行一个存储过程就可以了。
我们都是这样做的,很方便。
[解决办法]
就用事务,最好了。
一发即动。要不成功,要么回滚。
[解决办法]
写成存储过程
再调用存储过程
[解决办法]
用Castle.ActiveRecord来处理数据库吧,你只要在定义的类那写好类的关系,如一对多,多对多,这样就可以了
[解决办法]
具体可看http://terrylee.cnblogs.com/archive/2006/04/28/castl_ioc_article.html