掌握 NBearV3 ORM 模組開發 Web 應用的完整流程:實體關係設計(繼承、1:1、1:N、N:M)、可空型別與複合型別、工具生成程式碼/配置/資料庫腳本、Gateway 資料存取操作。
NBear.Common.Design.dllNBear.Common.dllNBear.Data.dllpublic struct UserName { public string FirstName; public string LastName; }
public enum UserStatus { Available, Deleted }
[MappingName("Categories")]
public interface Category : Entity {
[PrimaryKey] int CategoryID { get; }
[SqlType("nvarchar(15)")] string CategoryName { get; set; }
[SqlType("ntext")] string Description { get; set; }
byte[] Picture { get; set; }
}
[MappingName("Products")]
public interface Product : Entity {
[PrimaryKey] int ProductID { get; }
[SqlType("nvarchar(40)")] string ProductName { get; set; }
int SupplierID { get; set; }
int CategoryID { get; set; }
[SqlType("nvarchar(20)")] string QuantityPerUnit { get; set; }
decimal UnitPrice { get; set; }
short UnitsInStock { get; set; }
short UnitsOnOrder { get; set; }
short ReorderLevel { get; set; }
bool Discontinued { get; set; }
}
// 完整教學實體範例(User/LocalUser/UserProfile/LocalUserPhone/Group/UserGroup)
// 繼承:LocalUser : User
// 1:1:User.Profile → UserProfile (FkQuery, Contained=true, LazyLoad=false)
// 1:N:LocalUser.Phones → LocalUserPhone[] (FkQuery, Contained=true, LazyLoad=true)
// N:M:User.Groups → Group[] (ManyToManyQuery, 關聯實體 UserGroup)
// 複合型別:User.Name → UserName (CompoundUnit, SqlType=ntext)
// 可空型別:User.Birthday → DateTime?
// 關聯實體:UserGroup (Relation, RelationKey 指向 User/Group)
int ID { get; } 僅 get 映射自增欄位EntityDesignToEntity.exe 載入 DLLEntities\Entities.cswebsite\EntityConfig.xmlwebsite\db.sql(於目標資料庫執行建立資料表)<configSections>
<section name="entityConfig" type="NBear.Common.EntityConfigurationSection, NBear.Common" />
</configSections>
<entityConfig>
<includes> <add key="Sample Entity Config" value="~/EntityConfig.xml" /> </includes>
</entityConfig>
<connectionStrings>
<add name="DbName" connectionString="Server=(local);Database=tempdb;Uid=sa;Pwd=sa" providerName="NBear.Data.SqlServer.SqlDbProvider" />
</connectionStrings>
Gateway gateway = new Gateway("tempdb"); // 或 Gateway.Default
// 建立完整物件圖並級聯儲存
LocalUser newUser = new LocalUser();
newUser.ID = Guid.NewGuid();
newUser.Password = "12345";
newUser.Name = new UserName { FirstName = "teddy", LastName = "ma" };
newUser.Status = UserStatus.Available;
// 1:1 關聯
UserProfile profile = new UserProfile { ID = Guid.NewGuid(), UserID = newUser.ID, ProfileContent = "..." };
newUser.Profile = profile;
// 1:N 關聯
LocalUserPhone[] phones = new LocalUserPhone[2];
phones[0] = new LocalUserPhone { ID = Guid.NewGuid(), UserID = newUser.ID, Description = "home", Number = "111" };
phones[1] = new LocalUserPhone { ID = Guid.NewGuid(), UserID = newUser.ID, Description = "work", Number = "222" };
newUser.Phones = new LocalUserPhoneArrayList(phones);
// N:M 關聯(需手動處理,因未標記 Contained)
Group group = new Group { ID = Guid.NewGuid(), Name = "new group" };
newUser.Groups = new GroupArrayList { group };
gateway.Save<LocalUser>(newUser); // 級聯儲存 Profile、Phones,但不含 Groups
// 驗證儲存結果
LocalUser saved = gateway.Find<LocalUser>(newUser.ID);
// 檢查 Profile、Phones 是否級聯儲存
// Groups 未儲存 → 需手動儲存 Group + 建立 UserGroup 關聯實體
// 複合型別序列化自訂
SerializationManager.RegisterSerializeHandler(typeof(UserName),
o => ((UserName)o).FirstName + "," + ((UserName)o).LastName,
s => { var p = s.Split(','); return new UserName { FirstName = p[0], LastName = p[1]; });
gateway.Save<LocalUser>(saved); // 此後 UserName 存為 "teddy,ma" 而非 XML
// 方式 1:Web.config connectionStrings name
public static Gateway Northwind = new Gateway("Northwind");
public static Gateway TestAccessDb = new Gateway("TestAccessDb");
// 方式 2:直接提供連線字串
Gateway TestDbAccess = new Gateway(DatabaseType.MsAccess, @"C:\path\db.mdb");
Gateway Northwind = new Gateway(DatabaseType.SqlServer, "Server=(local);Database=Northwind;Uid=sa;Pwd=sa");
Gateway Northwind2 = new Gateway(DatabaseType.SqlServer9, "Server=(local)\SQLEXPRESS;Database=Northwind;Uid=sa;Pwd=sa");
Gateway MySql = new Gateway(DatabaseType.MySql, "Dsn=mysqltest;database=test;server=localhost;uid=root;pwd=sa");
Gateway Oracle = new Gateway(DatabaseType.Oracle, "Data Source=localhost;User ID=system;Pwd=sa;Unicode=True");
支援 Access、SQL Server 2000/2005、MySQL、Oracle 等多種資料庫。
執行後可見完整級聯儲存流程、N:M 關聯手動處理、複合型別 XML 序列化與自訂序列化切換效果。