我是 C# programimg 的初学者,我正在寻找一种方法来制作一些泛型,以便使用多个数据库更好地使用实体框架。
我的应用程序仅使用 Oracle 数据库构建,使用了我的应用程序中的所有实体。现在我们也需要在这个应用程序中实现 SQl Server 和 MySQL。
为此,我执行了以下步骤:
- 从我的主应用程序中删除所有实体;
- 创建了 3 个类库,每个数据库一个只包含模型和 EF 生成的类;
- 创建了第 4 个类库,其中包含要由每个数据库的对象填充的通用类。
这个“通用”类库包含每个表的这些项目:
- 同名表和相同字段的类(所有数据库的表名和字段名相同);
- 实现基本方法的接口;
- 实现接口方法的抽象类;
- 从我的每个数据库的抽象类继承的类;
- 使用数据库类型枚举创建所需数据库类的工厂类。
下面我使用我的设备表发布一个示例:
namespace MyApp.Data
{
internal interface IDevicesDAO
{
IEnumerable<Device> GetDevices();
IEnumerable<Device> GetDevices(int serverId);
Device GetDeviceById(int deviceId);
}
public abstract class DeviceDAO: IDevicesDAO
{
public abstract IEnumerable<Business.Device> GetDevices();
public abstract IEnumerable<Business.Device> GetDevices(int serverId);
public abstract Business.Device GetDeviceById(int deviceId);
protected abstract IEnumerable<Business.Device> ListDevice(int code);
}
internal static class DeviceDAO_Factory
{
public static DeviceDAO Create(DatabaseTypeEnum databaseType)
{
switch (databaseType)
{
case DatabaseTypeEnum.Oracle:
return new DeviceDAO_Oracle();
default:
return null;
}
}
}
class DeviceDAO_Oracle: DeviceDAO
{
public override IEnumerable<Device> GetDevices()
{
return ListDevice(0);
}
public override IEnumerable<Device> GetDevices(int serverId)
{
return ListDevice(serverId);
}
public override Device GetDeviceById(int deviceId)
{
OracleContext db = new OracleContext();
try
{
DEVICE loaded = db.DEVICES.Where(d => d.DEVICEID == deviceId).FirstOrDefault();
if (loaded != null)
{
Device loaDevice = FillDevice(loaded);
return loaDevice;
}
else
{
return null;
}
}
finally
{
db.Dispose();
}
}
protected override IEnumerable<Device> ListDevice(int code)
{
OracleContext db = new OracleContext();
try
{
List<DEVICE> devicelList;
List<Device> resultList;
if (code == 0)
devicelList = db.DEVICES.Where(d => d.SERVERID == code).ToList();
else
devicelList = db.DEVICES.ToList();
if (devicelList != null)
{
resultList = new List<Device>();
foreach (DEVICE item in devicelList)
{
Device newDevice = FillDevice(item);
resultList.Add(newDevice);
}
return resultList;
}
else
{
return null;
}
}
finally
{
db.Dispose();
}
}
private Device FillDevice(DEVICE item)
{
Device current = new Device();
current.Serverid = item.SERVERID;
current.Deviceid = item.DEVICEID;
current.Description = item.DESCRIPTION;
current.Ipaddress = item.IPADDRESS;
current.Shots = item.SHOTS;
current.Matrixnumber = item.MATRIXNUMBER;
current.Shottime = item.SHOTTIME;
current.Imageresize = item.IMAGERESIZE;
current.Imagewidth = item.IMAGEWIDTH;
current.Imageheight = item.IMAGEHEIGHT;
current.Devicetype = item.DEVICETYPE;
current.Devicegroup = item.DEVICEGROUP;
current.Devicetag = item.DEVICETAG;
current.Frameinterval = item.FRAMEINTERVAL;
current.Delaytime = item.DELAYTIME;
current.Eventinput = item.EVENTINPUT;
current.Accesspointid = item.ACCESSPOINTID;
current.Username = item.USERNAME;
current.Password = item.PASSWORD;
current.Defaultencoder = item.DEFAULTENCODER;
current.Isactive = item.ISACTIVE;
current.Stream = item.STREAM;
current.Uriaddress = item.URIADDRESS;
current.Devicesectionid = item.DEVICESECTIONID;
current.Userid = item.USERID;
current.Lastupdate = item.LASTUPDATE;
current.Framerate = item.FRAMERATE;
current.Initializedevice = item.INITIALIZEDEVICE;
current.Serviceid = item.SERVICEID;
current.Insertdelay = item.INSERTDELAY;
current.Plateposition = item.PLATEPOSITION;
current.Biosid = item.BIOSID;
current.Lasttimeactive = item.LASTTIMEACTIVE;
current.Status = item.STATUS;
current.Selectedprofiletoken = item.SELECTEDPROFILETOKEN;
current.Detectionsensibility = item.DETECTIONSENSIBILITY;
current.OnvifPort = item.ONVIF_PORT;
current.Nvraddress = item.NVRADDRESS;
return current;
}
}
}
我的问题是:
看到 Oracle 类了吗?如果我实现 SQL Server 和 MySQL,我将不得不使用相同的代码再创建 2 个类,因为存在不同的上下文和不同的表对象(即使对象在不同的上下文中具有相同的名称和字段。
我真的不喜欢这种做法,并猜测这是否是一种创建泛型或通用基础以更清洁的方式实现所有这些的方法。
对不起,长篇大论。我试图尽可能具体!对不起英语不好:)
任何帮助将不胜感激!
谢谢!