これが私の状況です。MySQL データベースに値を挿入するための共通関数を作成する必要があります。これまでのところ、以下のアプローチがあります。このコードは、別のクラス内に複合クラスがない場合に正常に機能します。エンティティにナビゲーション プロパティがある場合、このコードは壊れます。ここで立ち往生しています。
( ORM - クライアントの要件のため、使用できません)
public string create(object entity){
var sql = new OdbcCommand();
var d = new StringDictionary();
var dd = new StringDictionary();
try
{
var objectType = entity.GetType();
var properties = objectType.GetProperties();
var tableName = objectType.GetCustomAttributes(false).Select(x => (x as TableAttribute).Name).FirstOrDefault();
foreach (var prop in properties)
{
if (prop.DeclaringType != typeof (BasicRequest)) // BasicRequest is base class
{
if (
prop.GetCustomAttributes(false).Where(y=>y is ColumnAttribute).Select(x => (x as ColumnAttribute)).FirstOrDefault().IsPrimaryKey)
{
continue;
}
if (prop.PropertyType.IsGenericType) // here comes the problem
{
// the problem is if a class has List of its child
objects then how to insert them since here parent
is not yet inserted.
}
if (prop.GetCustomAttributes(false).Where(y => y is ColumnAttribute).Select(x => (x as ColumnAttribute)).FirstOrDefault().IsParent)
{
// same problem here also but this time this object is
parent object of the entity
/*parentObject = prop.GetValue(entity, null);
CreateNew(parentObject);
*/
continue;
}
d[prop.GetCustomAttributes(false).Where(y => y is ColumnAttribute).Select(x => (x as ColumnAttribute).Name).FirstOrDefault()] = DBUtil.FixSQLString(Convert.ToString(prop.GetValue(entity, null)));
}
else
{
continue;
}
}
Connection coxn = ConnectionPool.GetInstance().GetCoxn(Constants.MyName,ConnectionPool.WriteServer,"db_name");
sql.Connection = coxn.odbcConnection;
sql.CommandType = CommandType.Text;
sql.CommandText = DBUtil.CreateInsert(tableName, d);
int affected = sql.ExecuteNonQuery();
if (affected != 1)
{
ErrorMessage = "Insert Failed Unexpectedly";
return "0";
}
return "1";
}
catch (Exception ex)
{
ErrorMessage = ex.Message;
return "0";
}
}
エンティティを取りましょう (このようなデザインは私の手にありません。このクラスは既に存在しています。このエンティティを変更することはできません)
[Table(Name="person")]
public class Person
{
[Column(Name="id",IsPrimaryKey=true)] // Column is my custom attribute
public int Id{get;set;}
[Column(Name="name",IsPrimaryKey=true)]
public string Name{get;set;}
// this is where i'm not able get it how do i insert
// child class with the function i wrote above
[Column(IsChild=true)]
public List<Contact> contact{get;set;} // Navigation property
//Same problem with this property also
// how do i do insert for parent
[Column(IsParent=true)]
public User user{get;set;}
}
// i'll call that insert method as
Common c = new Common();
c.Create(Person p); // p will be passed as argument from controller