Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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#_Asp.net Mvc_Entity Framework_Ef Code First_Asp.net Mvc 5 - Fatal编程技术网

C# 导航属性为空

C# 导航属性为空,c#,asp.net-mvc,entity-framework,ef-code-first,asp.net-mvc-5,C#,Asp.net Mvc,Entity Framework,Ef Code First,Asp.net Mvc 5,非常奇怪的问题,我已经在很多项目中首先使用了EF+代码,但我不知道这里发生了什么 我拥有以下实体: public class Article { public int ID { get; set; } public string Title { get; set; } public virtual Media Image{ get; set; } public virtual Employee Author {get; set;} public MyEnu

非常奇怪的问题,我已经在很多项目中首先使用了EF+代码,但我不知道这里发生了什么

我拥有以下实体:

public class Article
{
    public int ID { get; set; }
    public string Title { get; set; }
    public virtual Media Image{ get; set; }
    public virtual Employee Author {get; set;}
    public MyEnum EnumValue {get; set;}
    public enum MyEnum {Value1, Value2}
}

public class Media
{
    public int ID {get; set;}
    public double Length { get; set; }
    public string ContentType { get; set; }
    public byte[] Content { get; set; }
}

public class Employee
{
    public int ID {get; set;}
    public string Name{get; set;}
    public string Email{get; set;}
}
使用以下DbContext:

public class MyContext : DbContext
    {
    public MyContext() : base("ConnectionString")
    {
        this.Configuration.LazyLoadingEnabled = true;
        this.Configuration.ProxyCreationEnabled = true;
    }

    public DbSet<Article> Articles { get; set; }
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Media> Medias { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Article>().HasRequired(x => x.Image);
        modelBuilder.Entity<Article>().HasOptional(x => x.Author);
    }
}
我有两个问题这里是我的问题:

  • 图像导航属性为空。它不是null,但其所有属性都有默认值(0、null等)
  • 文章对象具有动态代理,但导航属性图像和员工没有。如果我没记错的话,默认情况下导航属性应该由动态代理包装
  • 需要注意的一点是,Employee navigation属性已正确加载其所有属性。这很好,但是上面没有动态代理
我已经花了两个小时试图解决这个问题,我已经没有主意了

如果有任何提示/帮助,我将不胜感激

谢谢


更新:我已经检查了数据库,外键正常,图像表中的记录确实存在。

我不确定我是否完全理解你的问题,因为你在这里玩的术语有点快,有点松。在实体框架的意义上,动态代理是EF动态创建的类,它们继承自实际实体类,并覆盖虚拟引用和导航属性以启用延迟加载。在大多数情况下,这不是你真正需要注意的事情

导航属性总是显式添加的。实体框架在任何情况下都不会为您添加这些。从技术上讲,您在
文章
类上有两个引用属性,就是它。因此,Entity Framework创建了
Article
类的代理,并从查询结果中返回该代理的实例。通过尝试访问一个引用属性,如
Image
,可以激活代理类添加的延迟加载逻辑,从而向数据库发出新查询以获取该
媒体
实例。结果将是使用数据库查询结果实例化的对象,或者为null。我说不出为什么您会得到一个带有“默认”值的实例化
Media
实例。关于实体框架,没有什么会导致这种情况。必须有其他代码干扰该实例

至于
Media
Employee
go,这些类上没有导航属性。如果您希望能够访问相关的
文章集
s,则需要添加以下内容:

public virtual ICollection<Article> Articles { get; set; }
公共虚拟ICollection项目{get;set;}

非常感谢您抽出时间回答我的问题。谢谢,对我来说,文章和媒体是具有1到0关系的导航属性,在您的示例中,文章是1到n关系的导航属性。感谢您对代理的解释,但我确实知道这一点。我指的是,没有围绕这些导航属性创建代理来帮助解决这个问题,因为IIRC通常应该是这样的。不过,这是我的观点。不会创建代理,因为这些特定类上没有任何引用或导航属性。若并没有什么需要延迟加载的,那个么实体框架就不需要创建代理。噢,我现在明白了,谢谢!我会继续查看我的代码,看看是否有解释说明媒体属性为空,但我真的不知道是什么原因造成的。正如您所说,只是发现与EF无关。我在文章的构造器中每次都分配一个新媒体。。。但是现在我想知道EF什么时候用db的值分配检索到的对象的属性。也许它会跳过构造函数中手动分配的属性?谢谢你的帮助,能有别人的观点是非常令人耳目一新的。
public virtual ICollection<Article> Articles { get; set; }