Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为实体框架导航属性设置默认对象_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 为实体框架导航属性设置默认对象

C# 为实体框架导航属性设置默认对象,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,是否可以为实体设置默认对象 假设我有一个个人实体,该实体最初不需要配置文件 现在我需要一个配置文件——但现有实体当前没有配置文件 是否有一种方法可以在将来加载这些实体时为它们提供一个默认对象,这样使用Person实体的任何人都可以假设Profile从不为空,并且始终有一个值-即使它是默认值 在下面,您可以看到我尝试过的方法,它确实创建了一个默认值,但即使数据库中有某些内容,它也总是返回默认对象 如果Profile为null我想返回一个默认的初始化对象 如果配置文件不是空我想从数据库返回对象

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

假设我有一个
个人
实体,该实体最初不需要
配置文件

现在我需要一个
配置文件
——但现有实体当前没有
配置文件

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

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

  • 如果
    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
}
我知道可以初始化集合,使其不为null,但我也希望初始化单个对象。

使用

对于物化后加载到上下文中的每个实体,都会引发此事件

在上下文的构造函数中,订阅此事件。在事件处理程序中,检查实体类型是否为
Person
,如果是,则为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};

    }
}
公共类上下文:DbContext
{
私有只读ObjectContext m_ObjectContext;
公共数据库集人物{get;set;}
公共数据库集配置文件{get;set;}
公共上下文()
{
var m_ObjectContext=((IObjectContextAdapter)this).ObjectContext;
m_ObjectContext.ObjectMaterialized+=上下文_ObjectMaterialized;
}
void context_ObjectMaterialized(对象发送方,System.Data.Entity.Core.Objects.objectmaterialedeventargs)
{
var person=作为个人的实体;
if(person==null)
返回;
if(person.Profile==null)
person.Profile=newprofile(){person=person};
}
}

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

当您加载数据库中没有配置文件的
Person
对象,然后更新其某些属性并将其保存回数据库时,您希望发生什么情况?EF是否应该在数据库中为这样的人创建配置文件?@YacoubMassad我希望没有配置文件的
有一个
配置文件的实例化实例
-除非
SaveChanges()
被调用-但我现在不太担心这一部分-我只想实例化一个
配置文件
,如果它为null,如果它不为null,则正常从数据库加载。这是什么
用户
类?它是
Person
的基类吗?@YacoubMassad抱歉-我调整了我的实际代码以使问题更容易理解,但我忘记了将
User
类重命名为Person-它实际上应该是
Person
-我编辑了我的问题以反映这一点。这听起来真的很奇怪。你的用例是什么?这有点整洁。我能够利用它使剑道网格在非平坦视图模型的基础上运行,这使我能够保持性能(相对于内存中的过滤和排序)。一般来说,这样做有什么坏处吗?在测试概要文件不为null的场景时,我发现已经有一个与此命令相关联的开放DataReader