多态可以替代数据库中的字段吗?

lyb_abiandbel 2006-04-24 02:05:05
今天在设计一个系统的时候,遇到这样一个问题。

我想往数据库中添加Employee,Employee有三种类型,结构如下:

Employee和PaymentClassification关联,

HourlyClassification,SalariedClassfication,CommitionedClassification继承PaymentClassification,

TimeCard和HourlyClassification关联,SalesRecipt和CommitionedClassification关联。


开始的时候我并没有添加字段保存时哪种Employee,只是保存Employee的基本信息,

后来,我从数据库取得Employee的信息时,我不能提供Employee类的属性PaymentClassification信息。

如果不在数据库中用字段保存iswhichClassification的信息,PaymentClassification的信息从哪里来呢?

我总是觉得用多态可以代替那个字段,但是我不知道能不能实现,怎么实现。

多态是运行时,数据库是持久化,或许根本就不能。
...全文
287 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyb_abiandbel 2006-04-28
  • 打赏
  • 举报
回复
up

Knight94 2006-04-26
  • 打赏
  • 举报
回复
像这种嵌套关系,你只能先把成员存成xml,然后再以byte加载对象的xml中。
Knight94 2006-04-26
  • 打赏
  • 举报
回复
to 有多态行为, 我想得到他的具体类型

public class baseClass
{
public virtual void ReadXml( string XMLFileName )
{
//Read data to save base class object
}
public virtual void WriteXml( string XMLFileName )
{
//Write data to xml file
}
}

public class subClass:baseClass
{
public override void ReadXml( string XMLFileName )
{
//Read data to save sub-class object
}
public override void WriteXml( string XMLFileName )
{
//Write data to xml file
}
}
lyb_abiandbel 2006-04-26
  • 打赏
  • 举报
回复
empid,name,address这几个属性的序列化我是会做的,

属性public PaymentClassification PC 的序列化和反序列化也是和上面的一样操作吗?
lyb_abiandbel 2006-04-26
  • 打赏
  • 举报
回复
using System;

namespace BLL
{
public class Employee
{
public Employee()
{
}

public Employee(int m_empid,string m_itsAddres, string m_itsName)
{
this.m_empid=m_empid;
this.m_Addres=m_itsAddres;
this.m_Name=m_itsName;
}

private int m_empid;
private string m_Addres;
private string m_Name;
public int empid
{
get{return m_empid;}
set{m_empid=value;}
}

public string Addres
{
get{return m_Addres;}
set{m_Addres=value;}
}
public string Name
{
get{return m_Name;}
set{m_Name=value;}
}

private PaymentClassification pc;
public PaymentClassification PC //有多态行为, 我想得到他的具体类型,但是这里不是int,double等,xml可以直接存入这样的类信息吗?如果不行,我反序列化的时候还是要根据标记转换啊!
{
get{return this.pc;}
set{this.pc=value;}
}
private PaymentSchedule ps;
public PaymentSchedule PS //有多态行为
{
get{return this.ps;}
set{this.ps=value;}
}
private PaymentMethold pm;
public PaymentMethold PM //有多态行为
{
get{return this.pm;}
set{this.pm=value;}
}

#endregion
}
huangguangdou 2006-04-26
  • 打赏
  • 举报
回复
save
Knight94 2006-04-26
  • 打赏
  • 举报
回复
我的意思是你自己去xml序列化,就像DataSet那样,例如:
public class clsEmployeeName
{
private int nEmployeeID;
private string strUserName;
private byte[] bPhoto;
...
public void ReadXml( string XMLFileName )
{
// Use "XmlTextReader" to read data from file
// Then use these data to set class members
}

public void WriteXml( string XMLFileName )
{
// Use "XmlTextWriter" to write class members to file
// Caution: write these data in specific format which can be recognized by "ReadXml"
}
}
lyb_abiandbel 2006-04-26
  • 打赏
  • 举报
回复
to: Knight94(愚翁)

我做过的序列化和反序列化都是对int,double等这样的类型操作的。

"把整个对象进行序列化,以xml方式存入。"

你的意思是不是把多态的行为仍然以标记的方式存入XML,反序列化时根据标记得到想要的实际类型?

这样做有什么好处呢?好像原来我只是把它存入数据库,现在存入xml.

请指教一下。能提供一下代码最好了。
Knight94 2006-04-26
  • 打赏
  • 举报
回复
你是否想过序列化,除了保存每个对象的成员信息之外,把整个对象进行序列化,以xml方式存入。
Knight94 2006-04-25
  • 打赏
  • 举报
回复
现在的数据库都是关系类型数据库,你所牵扯到的是对象类型数据库。
要想实现你所说的,你只能在存进数据库之前做处理,然后取出来的时候再还原。
zhaoliang_chen 2006-04-25
  • 打赏
  • 举报
回复
数据库持久化可以看NHibernate
至于多态的行为是运行时的
lyb_abiandbel 2006-04-25
  • 打赏
  • 举报
回复
up
webwait 2006-04-25
  • 打赏
  • 举报
回复
mark
lyb_abiandbel 2006-04-25
  • 打赏
  • 举报
回复
To:Knight94(愚翁)

你说的很对。

如果数据库能直接存取对象,只要把对象直接存取就可以了。取出来可以直接用。

现在我只能象你说的那样。

取出:
public Employee PopulateEmployee(IDataRecord dr)
{
Employee user = new Employee();
user.empid = Convert.ToInt32(dr["id"]);

if (dr["name"] != DBNull.Value)
{
user.Name = Convert.ToString(dr["name"]).Trim();
}
user.Addres = Convert.ToString(dr["address"]).Trim();

switch (Convert.ToString(dr["classification"]).Trim())
{
case "1":
user.PC=new SalariedClassification();
break;
case "2":
user.PC=new HourlyClassification();
break;
}

switch (Convert.ToString(dr["paymentmethold"]).Trim())
{
case "1":
user.PM=new HoldMethold();
break;
}

switch (Convert.ToString(dr["paymentschedule"]).Trim())
{
case "1":
user.PS=new MonthlySchedule();
break;
case "2":
user.PS=new WeeklyShcedule();
break;
}

return user;
}

插入:
if(e.PC is SalariedClassification)
{command.Parameters.Add("@classification", SqlDbType.Char).Value = "1";}
else if(e.PC is HourlyClassification)
{command.Parameters.Add("@classification", SqlDbType.Char).Value = "2";}
else {command.Parameters.Add("@classification", SqlDbType.Char).Value = "3";}

if(e.PM is HoldMethold){command.Parameters.Add("@paymentmethold", SqlDbType.Char).Value = "1";}
else {command.Parameters.Add("@paymentmethold", SqlDbType.Char).Value = "2";}

if(e.PS is MonthlySchedule)
{command.Parameters.Add("@paymentschedule", SqlDbType.Char).Value = "1";}
else if(e.PS is WeeklyShcedule)
{command.Parameters.Add("@paymentschedule", SqlDbType.Char).Value = "2";}
else {command.Parameters.Add("@paymentschedule", SqlDbType.Char).Value = "1";}
lyb_abiandbel 2006-04-24
  • 打赏
  • 举报
回复
所以我才说“多态是运行时,数据库是持久化,或许根本就不能。”
lyb_abiandbel 2006-04-24
  • 打赏
  • 举报
回复
这里的替代要加引号。我知道多态不是这样用的。

我只是想区别PaymentClassification是哪种,这是多态的行为,当加入数据库的时候,我是否要加一个字段。

因为当我取得Employee的时候要决定他的属性PaymentClassification是哪种,

但是我觉得是否可以不根据从数据库取得字段来设置PaymentClassification的种类,

而在程序中设置,只是要根据什么设置呢?


我是这个意思。
ghchen 2006-04-24
  • 打赏
  • 举报
回复
数据库中一定要字段保存iswhichClassification的信息,多态的不是这样用的
jerryfos 2006-04-24
  • 打赏
  • 举报
回复
正如你所说的,根本就不可能代替
zhongkeruanjian 2006-04-24
  • 打赏
  • 举报
回复
数据库的字段怎么多态呢?

关于继承类的持久化,是很大的话题,你可以参考一下NHIBERATE。
flyzq 2006-04-24
  • 打赏
  • 举报
回复
简单问题复杂化

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧