ServiceStack.OrmLite:在哪里添加运行时属性(而不是inline/design-time属性)?
ServiceStack.OrmLite: Where to add runtime attributes (instead of inline/design-time attributes)?
大约 4 年前,我 asked this question。那时我决定不使用 OrmLite,但我现在又回来了。
这次我想知道添加运行时属性的代码在哪里?我尝试如下,但运行时属性没有出现。
我显然遗漏了什么,但是什么?
public ActorNotificationDbHandler()
{
DbAccount dbAccount = DBAccounts[0];
SetTableMeta();
_dbFactory = new OrmLiteConnectionFactory($"Uid={dbAccount.Username};Password={dbAccount.Password};Server={dbAccount.Address};Port={dbAccount.Port};Database={dbAccount.Database}", MySqlDialect.Provider);
_db = _dbFactory.Open();
if (_db.CreateTableIfNotExists<ActorNotification>())
{
_db.Insert(new ActorNotification { CreatedTime = DateTime.Now, ToActor = 123, Status = ActorNotification.ActorNotificationStatuses.Created });
_db.Insert(new ActorNotificationMessage { ActorNotificationId = 1, MessageState = ActorNotificationMessage.MessageStates.Created });
}
var result = _db.SingleById<ActorNotification>(1);
result.PrintDump(); //= {Id: 1, Name:Seed Data}
}
private void SetTableMeta()
{
typeof(ActorNotification).GetProperty("Id").AddAttributes(new IndexAttribute { Unique = true }, new AutoIncrementAttribute());
typeof(ActorNotification).GetProperty("ToActor").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotification).GetProperty("CoreObjectId1").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotification).GetProperty("CoreObjectId2").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotification).GetProperty("Status").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotification).GetProperty("CreatedTime").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("Id").AddAttributes(new IndexAttribute { Unique = true }, new AutoIncrementAttribute());
typeof(ActorNotificationMessage).GetProperty("ActorNotificationId").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("FrontEndServerHandler").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("TimeCreated").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("TimeStatusChanged").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("MessageState").AddAttributes(new IndexAttribute { Unique = false });
}
和之前很多次一样,我在 post 问题之后找到了答案。但是,也许它会对其他人有所帮助。
解决方法:
将 SetTableMet() 移动到创建 Db 工厂和 db:
之后
public ActorNotificationDbHandler()
{
DbAccount dbAccount = Core.Server.SRefCoreServer.dbHandler.DBAccounts[0];
_dbFactory = new OrmLiteConnectionFactory($"Uid={dbAccount.Username};Password={dbAccount.Password};Server={dbAccount.Address};Port={dbAccount.Port};Database={dbAccount.Database}", MySqlDialect.Provider);
_db = _dbFactory.Open();
SetTableMeta();
if (_db.CreateTableIfNotExists<ActorNotification>())
{
_db.Insert(new ActorNotification { CreatedTime = DateTime.Now, ToActor = 123, Status = ActorNotification.ActorNotificationStatuses.Created });
_db.Insert(new ActorNotificationMessage { ActorNotificationId = 1, MessageState = ActorNotificationMessage.MessageStates.Created });
}
var result = _db.SingleById<ActorNotification>(1);
result.PrintDump(); //= {Id: 1, Name:Seed Data}
}
您通常不必这样做(因为它会在使用任何独立的 ServiceStack 库时自动调用),但如果您要添加运行时属性,则需要确保调用 ServiceStack.Text 静态构造函数通过手动调用 JsConfig.InitStatics(),例如:
private void SetTableMeta()
{
JsConfig.InitStatics();
//...
}
否则 OrmLiteConnectionFactory
也会在其构造函数中调用它,因此您可以在初始化 __dbFactory
之后初始化任何运行时属性,例如:
_dbFactory = new OrmLiteConnectionFactory(...);
SetTableMeta();
_db = _dbFactory.Open();
大约 4 年前,我 asked this question。那时我决定不使用 OrmLite,但我现在又回来了。
这次我想知道添加运行时属性的代码在哪里?我尝试如下,但运行时属性没有出现。
我显然遗漏了什么,但是什么?
public ActorNotificationDbHandler()
{
DbAccount dbAccount = DBAccounts[0];
SetTableMeta();
_dbFactory = new OrmLiteConnectionFactory($"Uid={dbAccount.Username};Password={dbAccount.Password};Server={dbAccount.Address};Port={dbAccount.Port};Database={dbAccount.Database}", MySqlDialect.Provider);
_db = _dbFactory.Open();
if (_db.CreateTableIfNotExists<ActorNotification>())
{
_db.Insert(new ActorNotification { CreatedTime = DateTime.Now, ToActor = 123, Status = ActorNotification.ActorNotificationStatuses.Created });
_db.Insert(new ActorNotificationMessage { ActorNotificationId = 1, MessageState = ActorNotificationMessage.MessageStates.Created });
}
var result = _db.SingleById<ActorNotification>(1);
result.PrintDump(); //= {Id: 1, Name:Seed Data}
}
private void SetTableMeta()
{
typeof(ActorNotification).GetProperty("Id").AddAttributes(new IndexAttribute { Unique = true }, new AutoIncrementAttribute());
typeof(ActorNotification).GetProperty("ToActor").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotification).GetProperty("CoreObjectId1").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotification).GetProperty("CoreObjectId2").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotification).GetProperty("Status").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotification).GetProperty("CreatedTime").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("Id").AddAttributes(new IndexAttribute { Unique = true }, new AutoIncrementAttribute());
typeof(ActorNotificationMessage).GetProperty("ActorNotificationId").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("FrontEndServerHandler").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("TimeCreated").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("TimeStatusChanged").AddAttributes(new IndexAttribute { Unique = false });
typeof(ActorNotificationMessage).GetProperty("MessageState").AddAttributes(new IndexAttribute { Unique = false });
}
和之前很多次一样,我在 post 问题之后找到了答案。但是,也许它会对其他人有所帮助。
解决方法: 将 SetTableMet() 移动到创建 Db 工厂和 db:
之后public ActorNotificationDbHandler()
{
DbAccount dbAccount = Core.Server.SRefCoreServer.dbHandler.DBAccounts[0];
_dbFactory = new OrmLiteConnectionFactory($"Uid={dbAccount.Username};Password={dbAccount.Password};Server={dbAccount.Address};Port={dbAccount.Port};Database={dbAccount.Database}", MySqlDialect.Provider);
_db = _dbFactory.Open();
SetTableMeta();
if (_db.CreateTableIfNotExists<ActorNotification>())
{
_db.Insert(new ActorNotification { CreatedTime = DateTime.Now, ToActor = 123, Status = ActorNotification.ActorNotificationStatuses.Created });
_db.Insert(new ActorNotificationMessage { ActorNotificationId = 1, MessageState = ActorNotificationMessage.MessageStates.Created });
}
var result = _db.SingleById<ActorNotification>(1);
result.PrintDump(); //= {Id: 1, Name:Seed Data}
}
您通常不必这样做(因为它会在使用任何独立的 ServiceStack 库时自动调用),但如果您要添加运行时属性,则需要确保调用 ServiceStack.Text 静态构造函数通过手动调用 JsConfig.InitStatics(),例如:
private void SetTableMeta()
{
JsConfig.InitStatics();
//...
}
否则 OrmLiteConnectionFactory
也会在其构造函数中调用它,因此您可以在初始化 __dbFactory
之后初始化任何运行时属性,例如:
_dbFactory = new OrmLiteConnectionFactory(...); SetTableMeta();
_db = _dbFactory.Open();