Entity framework EF代码第一不确定性原则-参考实体可能无法加载

Entity framework EF代码第一不确定性原则-参考实体可能无法加载,entity-framework,asp.net-mvc-2,code-first,Entity Framework,Asp.net Mvc 2,Code First,通过自动重新创建数据库,不确定引用的实体是否会被加载 上下文是EF CTP 5和ASP.NET MVC 2。在global.asax中,设置了一个数据库初始值设定项,在每次应用程序启动时强制重新创建数据库 在控制器操作中从上下文成功检索实体在遍历引用时仍可能导致空引用错误,即使引用标记为必需(在数据库中不是空的)。关闭延迟加载没有任何区别 这种行为无法可靠地再现,但使用卡西尼号在两个不同的工作站(XP,7)上观察到 以下是模型。尝试访问NewsFeed对象的NewsProvider属性时引发空引

通过自动重新创建数据库,不确定引用的实体是否会被加载

上下文是EF CTP 5和ASP.NET MVC 2。在global.asax中,设置了一个数据库初始值设定项,在每次应用程序启动时强制重新创建数据库

在控制器操作中从上下文成功检索实体在遍历引用时仍可能导致空引用错误,即使引用标记为必需(在数据库中不是空的)。关闭延迟加载没有任何区别

这种行为无法可靠地再现,但使用卡西尼号在两个不同的工作站(XP,7)上观察到

以下是模型。尝试访问
NewsFeed
对象的
NewsProvider
属性时引发空引用异常。去掉虚拟限定符没有什么区别

public class NewsProvider
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }
}

public class NewsFeed
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a URL")]
    [StringLength(300, ErrorMessage = "The URL is too long")]
    public string Url { get; set; }

    [Required(ErrorMessage = "Please enter a news provider")]
    public virtual NewsProvider NewsProvider { get; set; }
}

这只是猜测,但复杂类型永远不能为null。因此,如果您有任何对复杂类型(ICollection)的引用,您应该从实体构造函数初始化它们

示例:

 public class NewsProvider
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }
}

public class NewsFeed
{
    public NewsFeed() {
        //Never allow NewsProvider to be null
        NewsProvider = new NewsProvider();
    }
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a URL")]
    [StringLength(300, ErrorMessage = "The URL is too long")]
    public string Url { get; set; }

    [Required(ErrorMessage = "Please enter a news provider")]
    public virtual NewsProvider NewsProvider { get; set; }
}
有关更多信息,请参阅以下一篇精彩的博文:

这只是猜测,但复杂类型永远不能为空。因此,如果您有任何对复杂类型(ICollection)的引用,您应该从实体构造函数初始化它们

示例:

 public class NewsProvider
{
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }
}

public class NewsFeed
{
    public NewsFeed() {
        //Never allow NewsProvider to be null
        NewsProvider = new NewsProvider();
    }
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a URL")]
    [StringLength(300, ErrorMessage = "The URL is too long")]
    public string Url { get; set; }

    [Required(ErrorMessage = "Please enter a news provider")]
    public virtual NewsProvider NewsProvider { get; set; }
}
有关更多信息,请参阅以下一篇精彩的博文:

我能看看你的型号吗?抛掷的实体是一对多吗?如果是这样,我想我知道这个问题,可以相应地更新我的答案!(NewsProvider有许多新闻提要)我想他们需要对您的模型或Fluent Mapping API做一些小的更改,所以我可以再介绍一下这种关系。我可以看看您的模型吗?抛掷的实体是一对多吗?如果是这样,我想我知道这个问题,可以相应地更新我的答案!(NewsProvider有很多新闻提要)关于这种关系,我想他们需要对您的模型或Fluent Mapping API进行一些小的更改。这是一个好主意,谢谢。但是,它并没有解决这个问题,因为当您阅读产品并发现Category属性为null时会出现这个问题,即使产品行在CategoryId列中有一个值。更新了上面的代码以演示您的模型的构造函数初始化。这是一个好主意,谢谢。但是,它没有解决这个问题,因为当您阅读产品并发现Category属性为null时,即使产品行在CategoryId列中有一个值,也会出现这个问题。更新了上面的代码,以演示您的模型的构造函数初始化。