針對 MiniORM 反饋的 Bug 及使用困惑,本文提供完整測試代碼、實體類定義、數據庫結構,並修復兩個關鍵 Bug。
PubFuncs.GetObjectType() 緩存邏輯缺陷public static Type GetObjectType(string asm, string ns, string cls) {
Type objType = (Type)_HashObjectType[asm + ns + cls];
if (objType == null) {
object obj = Assembly.Load(asm).CreateInstance(ns + "." + cls);
_HashObjectType[asm + ns + cls] = obj.GetType();
// 修復:重新賦值 objType,否則返回 null
objType = (Type)_HashObjectType[asm + ns + cls];
}
return objType;
}
OrmWriter.CheckValidate() 空 WHERE 條件導致 SQL 錯誤public void CheckValidate(object ModelObject) {
// ... 構建 strWHERE ...
// 修復:執行前判斷 strWHERE 不為空
if (strWHERE.Trim() != "") {
strSQL = string.Format(strSQL, strTablename, strWHERE);
// ... 執行查詢拋異常 ...
}
}
實體類圖:
數據庫表結構:
Person (ID PK, name, age, sex) 
Hand (ID PK, PersonID FK, name) 
Head (ID PK, PersonID FK, name) 
[DataObjectAttribute("Person", "ID", "")]
public class Person {
[DataFieldAttribute("ID", true)] public int ID { get; set; } // true=Identity
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Head")]
public Head Head { get; set; }
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
public Hand LeftHand { get; set; }
[SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
public Hand RightHand { get; set; }
[DataFieldAttribute("name", "NvarChar")] public string Name { get; set; }
[DataFieldAttribute("age", "int")] public int Age { get; set; }
[DataFieldAttribute("sex", "NvarChar")] public string Sex { get; set; }
}
[DataObjectAttribute("Hand", "ID", "PersonID")]
public class Hand {
[DataFieldAttribute("ID", true)] public int ID { get; set; }
[DataFieldAttribute("PersonID")] public int PersonID { get; set; }
[DataFieldAttribute("name", "NvarChar")] public string Name { get; set; }
}
[DataObjectAttribute("Head", "ID", "PersonID")]
public class Head {
[DataFieldAttribute("ID", true)] public int ID { get; set; }
[DataFieldAttribute("PersonID")] public int PersonID { get; set; }
[DataFieldAttribute("name", "NvarChar")] public string Name { get; set; }
}
[STAThread]
static void Main() {
WriteTest(); // 插入測試
ReadTest(); // 讀取驗證
}
static void WriteTest() {
Person p = new Person { Name = "snoopy", Age = 5, Sex = "male" };
p.LeftHand = new Hand { Name = "左手" };
p.RightHand = new Hand { Name = "右手" };
p.Head = new Head { Name = "大笨腦袋" };
new OrmWriter().Write(p);
}
static void ReadTest() {
Person p = (Person)new OrmReader().Read(new Person(), 1);
Console.WriteLine($"Name:{p.Name}, Age:{p.Age}, Sex:{p.Sex}");
Console.WriteLine($"LeftHand:{p.LeftHand.Name}, RightHand:{p.RightHand.Name}, Head:{p.Head.Name}");
Console.Read();
}

輸出正確顯示 Person 及其關聯的 LeftHand、RightHand、Head 屬性,驗證 MiniORM 級聯寫入/讀取功能正常。