如何在实体类中存储数据库名称
本文关键字:存储 数据库 实体 | 更新日期: 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;}