gpt4 book ai didi

c# - 为 Entity Framework 导航属性设置默认对象

转载 作者:行者123 更新时间:2023-11-30 23:34:06 25 4
gpt4 key购买 nike

是否可以为实体设置默认对象?

假设我有一个 Person 实体,它最初不需要 Profile

现在我需要一个Profile - 但有些现有实体目前没有Profile

有没有一种方法可以在将来加载这些实体时为它们提供默认对象,这样使用 Person 实体的任何人都可以假设 Profile 永远不会null 并且始终有一个值 - 即使它是默认值。

下面您可以看到我尝试过的方法 - 它确实创建了一个默认值 - 但即使数据库中有某些内容,它也总是返回默认对象。

  • 如果 Profilenull 我想返回一个默认的初始化对象
  • 如果Profile 不是 null 我想从数据库中返回对象

另外 - 将“默认”对象附加到我的 dbcontext 的最明智的方法是什么?

我怎样才能实现这种期望的行为?

public class Person
{
[Key]
public int Id {get; set;}

private Profile _profile;
public virtual Profile Profile
{
get
{
return _profile ?? (_profile= new Profile
{
Person = this,
PersonId = Id
});
}
set
{
_profile = value;
}

// properties
}
}

public class Profile
{
[Key, ForeignKey("Person")]
public int PersonId {get; set;}

[ForeignKey("PersonId")]
public virtual Person Person{ get; set; }

// properties
}

我知道您可以初始化集合以使它们不为空,但我也想初始化单个对象。

最佳答案

使用 ObjectContext.ObjectMaterialized Event .

此事件是为在具体化后加载到上下文中的每个实体引发的。

在您的上下文的构造函数中,订阅此事件。在事件处理程序中,检查实体类型是否为 Person,如果是,则为该人创建新的配置文件。这是一个代码示例:

public class Context : DbContext
{
private readonly ObjectContext m_ObjectContext;

public DbSet<Person> People { get; set; }
public DbSet<Profile> Profiles { get; set; }

public Context()
{
var m_ObjectContext = ((IObjectContextAdapter)this).ObjectContext;

m_ObjectContext.ObjectMaterialized += context_ObjectMaterialized;

}

void context_ObjectMaterialized(object sender, System.Data.Entity.Core.Objects.ObjectMaterializedEventArgs e)
{

var person = e.Entity as Person;

if (person == null)
return;

if (person.Profile == null)
person.Profile = new Profile() {Person = person};

}
}

请注意,如果您提交更改,新配置文件将保存回数据库。

关于c# - 为 Entity Framework 导航属性设置默认对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600799/

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