我正在尝试学习对象关系映射,并制作了自己的方法,接受对象并将列名映射到对象中各自的属性。
我想在插入时做同样的事情,只需指定存储过程并将对象的属性名映射到各自的列名。但我不确定我该怎么做,或者是否有可能?有人知道好的c#对象关系映射教程吗?
我在下面提供了我的读者,它填充了一个列表。
我这样做只是为了好玩,所以我不想使用任何ORM框架。
public static List<T> loadFromReader(string sProcName)
{
List<T> EntityCollection = new List<T>();
Type type = typeof(T);
PropertyInfo[] properties = typeof(T).GetProperties();
using (Connection)
{
SqlCommand command = new SqlCommand(sProcName);
command.CommandType = CommandType.StoredProcedure;
if (SqlParamterList != null && SqlParamterList.Count > 0)
{
foreach (SqlParameter parameter in SqlParamterList)
command.Parameters.Add(parameter);
}
using (SqlDataReader reader = command.ExecuteReader())
{
int columnCount = reader.FieldCount;
string[] columnName = new string[columnCount];
for (int i = 0; i <= columnCount - 1; i++)
columnName[i] = reader.GetName(i);
while (reader.Read())
{
object obj = Activator.CreateInstance(type);
for (int i = 0; i <= columnName.Length - 1; i++)
{
foreach (PropertyInfo property in properties)
{
if (property.Name.Contains(columnName[i]))
{
object value = reader[i];
if (value == DBNull.Value)
value = null;
type.GetProperty(property.Name).SetValue(obj, value, null);
}
}
}
EntityCollection.Add((T)obj);
}
}
clearParameters();
return EntityCollection;
}
}
不太清楚你遇到了什么问题,但这里有几个指针:
-
您可以在这里看到一个如何获取存储过程参数信息的示例,这需要您准备好与其参数匹配的存储过程。
-
如果您愿意,您可以通过在数据库中以XML格式存储数据来创建更灵活的系统。这样,您就不必将实体映射到存储过程和/或表。
由于标记答案中提供的链接,我最终能够将对象属性映射到具有相同名称的存储过程参数。我提供了下面的代码:
public static void insertObjectMapper(string sProcName, List<T> entities)
{
Type type = typeof(T);
PropertyInfo[] properties = typeof(T).GetProperties();
string[] paramNames = null;
using (SqlCommand command = new SqlCommand(sProcName, Connection))
{
command.CommandType = CommandType.StoredProcedure;
SqlCommandBuilder.DeriveParameters(command);
if (command.Parameters != null || command.Parameters.Count > 0)
{
clearParameters();
foreach (SqlParameter parameter in command.Parameters)
addParameter(parameter.ParameterName, parameter.SqlDbType, parameter.Direction, parameter.Value);
paramNames = new string[SqlParamterList.Count];
int count = 0;
foreach (SqlParameter parameter in SqlParamterList)
{
paramNames[count] = parameter.ParameterName.Substring(1);
++count;
}
foreach (T entity in entities)
{
for (int i = 0; i <= paramNames.Length - 1; i++)
{
foreach (PropertyInfo property in properties)
{
if (property.Name.Contains(paramNames[i]))
{
foreach (SqlParameter parameter in SqlParamterList)
{
if (parameter.ParameterName.Substring(1).Contains(paramNames[i]))
{
parameter.Value = entity.GetType().GetProperty(paramNames[i]).GetValue(entity, null);
break;
}
}
}
}
}
command.Parameters.Clear();
foreach (SqlParameter parameter in SqlParamterList)
command.Parameters.Add(parameter);
command.ExecuteNonQuery();
}
}
}
}