【问题标题】:ServiceStack.OrmLite: Where to add runtime attributes (instead of inline/design-time attributes)?ServiceStack.OrmLite:在哪里添加运行时属性(而不是内联/设计时属性)?
【发布时间】:2018-04-19 07:28:51
【问题描述】:

大约 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 });
}

【问题讨论】:

    标签: c# servicestack ormlite-servicestack


    【解决方案1】:

    和以前一样,我在发布问题后找到了答案。但是,也许它会帮助其他人。

    解决方案: 将 SetTableMet() 移至创建数据库工厂和数据库之后:

    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}
    }

    【讨论】:

      【解决方案2】:

      您通常不必这样做(因为它在使用任何独立的 ServiceStack 库时会自动调用),但如果您要添加运行时属性,则需要确保通过调用 @ 调用 ServiceStack.Text 静态构造函数987654321@手动,例如:

      private void SetTableMeta()
      {
          JsConfig.InitStatics();
          //...
      }
      

      否则OrmLiteConnectionFactory 也会在其构造函数中调用它,这样您就可以在初始化__dbFactory 之后初始化任何运行时属性,例如:

      _dbFactory = new OrmLiteConnectionFactory(...); SetTableMeta();

      _db = _dbFactory.Open();
      

      【讨论】:

      • 对不起,我没有关注这个。配置?自动调用? SetTableMeta() 可以在 dbFactory 之后,但我猜它是否在 .Open 之后并不重要? =)
      • @Ted 是的,它可以在 _dbFactory 或 _db 之后
      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 2011-04-11
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      相关资源
      最近更新 更多