如何在实体类中存储数据库名称

本文关键字:存储 数据库 实体 | 更新日期: 2023-09-27 18:16:56

我想在POCO实体类上创建一个只读属性[NotMapped]Database {get;},以反映创建时从该实体加载的数据库的名称,以便在没有DbContext实例可用时稍后读取该值。我如何告诉EF在对象创建时加载这些数据?

我知道context.Database.Connection.ConnectionString,但那不是我想做的。当对象通过DbContext类实例化时,我想将属性设置为当前数据库名称。

我已经搜索了这个问题,但是没有找到任何信息可以在这里提供,也许我不知道如何表达这个问题。

如何在实体类中存储数据库名称

您可以这样做。首先创建一些接口:

public interface IHasDatabaseName {
    string Database { set; }
}

并为所讨论的实体实现。然后在您的DbContext的构造函数(或在任何地方,您构建您的DbContext,如果您使用DI容器为例),订阅ObjectMaterialized事件:

// this is DbContext here
((IObjectContextAdapter) this).ObjectContext.ObjectMaterialized += ObjectContextOnObjectMaterialized;

然后:

// this is DbContext here
private void ObjectContextOnObjectMaterialized(object sender, ObjectMaterializedEventArgs objectMaterializedEventArgs) {
    var dbName = objectMaterializedEventArgs.Entity as IHasDatabaseName;
    if (dbName != null) {
        dbName.Database = this.Database.Connection.Database;
    }
}

我认为您需要在表上创建一个计算列来获取该信息。比如:

alter table YourTable add [Database] AS DB_NAME();

然后将POCO属性定义为Database {get;}