首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于架构的一个有关问题

2012-02-27 
关于架构的一个问题数据库里有3个表,我在数据层(DAL层)里建3个类,一个类对应一个表,每个类负责进行对相应

关于架构的一个问题
数据库里有3个表,我在数据层(DAL层)里建3个类,一个类对应一个表,每个类负责进行对相应的表的读和写!但是有的时候一个操作可能要同时向两个表或者三个表里写入数据或读出数据!这样的话怎么解决!
不知道我说清楚了没有!不懂的话我再解释!
谢谢!


[解决办法]
那你就把涉及到3个表的操作封装成一个类 不就OK了嘛...
[解决办法]
友情帮顶~
[解决办法]
一般情况是对 该类封装的这个表做操作 

操作无非就是增 删 查改

通常是用存储过程来实现

设计到多表的可以写个视图 然后用存储过程来处理视图
[解决办法]
用视图啊。
如果对数据的操作不复杂的话就把那几个类一一实例化,然后分别操作也可以。
[解决办法]
数据访问层是提供数据的,并不能要求以个类严格对应一个表。因为无可避免的要进行多表操作。。我们常常会把关联关系的对象封装在一起,比如果有个 学生表和成绩表,有时候我们需要读出一个学生的成绩。那我们可以在学生对象添加一个属性叫成绩。在DAL层把属性填充。总之,表和数据访问的类不是严格对应,不能说一个类仅仅只有操作一个表的职能。
[解决办法]
用事务吧。如果三个表一起操作时,如果有一个表没有操作成功,就会回滚。反之就是都成功了。
我个人觉得这样比较保险点。
[解决办法]
用事务或触发器来求得几个表的连动
[解决办法]
其实像关于数据库的有些问题,你发布到数据库版块,也许会得到更想要的答案
[解决办法]

探讨
数据访问层是提供数据的,并不能要求以个类严格对应一个表。因为无可避免的要进行多表操作。。我们常常会把关联关系的对象封装在一起,比如果有个 学生表和成绩表,有时候我们需要读出一个学生的成绩。那我们可以在学生对象添加一个属性叫成绩。在DAL层把属性填充。总之,表和数据访问的类不是严格对应,不能说一个类仅仅只有操作一个表的职能。

[解决办法]

[解决办法]
如果用ORM的话将同时操作几个表的这种操作做成存储过程。按顺序操作几个表的过程用事务。DAL层放个基类,里面有操作表的基本方法。
[解决办法]
up
[解决办法]
没搞明白,为什么一个表对应一个类?
[解决办法]
可以在除定义这3个表对应的类外,再定义一个类来操作多个表啊!或者象7楼说的。

探讨
数据访问层是提供数据的,并不能要求以个类严格对应一个表。因为无可避免的要进行多表操作。。我们常常会把关联关系的对象封装在一起,比如果有个 学生表和成绩表,有时候我们需要读出一个学生的成绩。那我们可以在学生对象添加一个属性叫成绩。在DAL层把属性填充。总之,表和数据访问的类不是严格对应,不能说一个类仅仅只有操作一个表的职能。

[解决办法]
DAL层负责单表的简单操作
再在之上建一个业务层或者随便哪个类似的名字,里面实现复杂的数据操作,通过DAL的组合来实现。当然如果是多个DAL操作,可能需要用事务。

[解决办法]
发现10楼的朋友有天王的长像,天才的智商。。。不错不错。。。。。

其实要不要一个表对应一个类,这个应该跟据实际来吧,不过多表连动的话,最好使用事务去处理(相信这个谁都知道)。

有的时候其实上,一个操作对应一个类,会更容易一点。
[解决办法]
数据库层只做单表操作.

多表操作.放到逻辑屋去处理.



[解决办法]
顶,对象和范式表的冲突,学习。
[解决办法]
把三個表建立成一個視圖就可以了
[解决办法]
为什么不用事务控制呢?
[解决办法]
查msdn.
[解决办法]


MSDN上关于事务的例子,供参考
static void Main(string[] args)
{
try
{
//Create the transaction scope
using (TransactionScope scope = new TransactionScope())


{
//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

热点排行