【问题标题】:ASP.NET Models - Best Empty Object Creation?ASP.NET 模型 - 最好的空对象创建?
【发布时间】:2013-07-23 19:04:14
【问题描述】:

因此,如果我想将艺术家添加到我的网站,并创建一个包含该艺术家的模型以及一些其他详细信息,例如:

namespace SuperMusic.Models
{
   public artist NewArtist { get; set; }
   public IEnumerable<RecordCompanies> RecordCompanies
   {
      get { //some code to populate possible record companies }
   }

现在我可以查看创建新艺术家的视图,并且我的模型可以填充艺术家可以关联的唱片公司的下拉列表。

但在我的控制器中,我必须定义“新艺术家”。我相信有两种方法可以做到这一点:

newArtistModel.NewArtist = context.artist.Create();
newArtistModel.NewArtist = new artist();

其中一个比另一个更正确吗?还是代码实际上存在差异,其中一个不正确?

再次感谢您回答我的菜鸟问题!

【问题讨论】:

  • 你不应该在你的视野中发布域对象
  • @Kyle 不明白你的意思。

标签: asp.net-mvc entity-framework asp.net-mvc-4


【解决方案1】:

第一个选项newArtistModel.NewArtist = context.artist.Create(); 是创建新实例的正确方法,因为Context 将创建实体框架感知代理对象。

代理对象提供对导航属性等的全面支持

还有更完整的答案here

【讨论】:

  • +1 链接,但我仍然不确定到底在后台发生了什么。是 .Create() 允许访问导航属性而 new 不允许吗?为什么我创建对象的实例时不创建它们?
  • @DR913 这取决于您如何定义 POCO。通常你的导航属性是用virtual 关键字定义的。拥有proxy 意味着EF 可以覆盖virtual 属性并管理导航/延迟加载。当您new 升级类(通过在您的类定义中初始化集合)时,您可以通过自己管理导航属性来使 POCO 工作,但实现相同目的需要更多代码。当newing 上课时,你会发现很多关于让导航属性工作的问题。 EF 已经够混乱了!
  • 我明白了。我想我只是还没有遇到这个。感谢您的帮助!
【解决方案2】:

这个艺术家被用于视图,所以只需要渲染表单。不需要 EF 上下文。

所以在初始化视图的时候:

newArtistModel.NewArtist = new artist();

然后,当您发布表单并想要保存艺术家时,您将需要上下文并且可以使用:context.artist.Create();

【讨论】:

    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多