gpt4 book ai didi

c# - 加载后如何使用 POCO 和 DbContext 在 Entity Framework 中初始化对象?

转载 作者:行者123 更新时间:2023-12-02 22:31:02 25 4
gpt4 key购买 nike

我正在使用 EF5。我想初始化 DbContext 中包含的 DbSet 集合的每个对象,最好(但不一定)在初始化对象字段(但不一定与其他 POCO 的关系)之后。这可能简称为“施工后拦截”或“加载后拦截”。

初始化需要使用与 DbContext 实例并行存在的对象实例(当前用户设置等)来设置对象的一些属性。

所以基本上:

var settings = new Settings();
settings.PrintName = false;

var context = new MyDbContext();
// here initialize context so that every User object get initialized with settings
var john = context.Users.Where(x => x.Name == "John").FirstOrDefault();
Assert.AreEqual(john.Settings, settings);

除了遍历集合中的所有对象并手动设置属性之外,还有什么可能的方法可以实现这一点?

最佳答案

您可以使用在 ObjectContext 上公开的 ObjectMaterialized 事件:

var settings = new Settings();
settings.PrintName = false;

var dbContext = new MyDbContext();
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.ObjectMaterialized += (sender, e) => {
var user = e.Entity as User;
if (e != null) {
// Now you can call your initialization logic
user.Settings = settings;
}
};

var john = dbContext.Users.Where(x => x.Name == "John").FirstOrDefault();
Assert.AreEqual(john.Settings, settings);

ObjectMaterialized 事件应该在从数据库记录填充通用(标量和复数)属性之后但在填充导航属性之前引发。

关于c# - 加载后如何使用 POCO 和 DbContext 在 Entity Framework 中初始化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12245516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com