在Entity Framework中存储对象(一对多关系)

时间:2012-05-23 07:49:59

标签: asp.net-mvc entity-framework one-to-many

其实我正在研究简单的项目MVC4 + EF,其中我有关系应用程序许可证。在应用程序上可能有零个或多个许可证,但每个许可证只有一个应用程序。我注意到操作编辑/创建新许可证有些问题。我过去了部分代码。

我的实体域名定义:

public class Application
{
    public Application()
    {
        Licenses = new List<License>();
    }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ApplicationID { get; set; }

    public string Name { get; set; }

    public List<License> Licenses { get; set; }
}

public class License
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [HiddenInput(DisplayValue = false)]
    public Guid LicenseID { get; set; }

    [Required]
    public string Name { get; set; }

    public Version Version { get; set; }

    public Application Application { get; set; }
}

在应用程序和许可证之间定义一对多:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Application>()
        .HasMany(app => app.Licenses)
        .WithRequired()
        .Map(conf => conf.MapKey("OwnerID"))
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<License>()
        .HasRequired(lic => lic.Application)
        .WithMany()
        .Map(conf => conf.MapKey("ApplicationID"))
        .WillCascadeOnDelete(false);
}

许可证控制器中的操作:

public ActionResult Create(Guid applicationID)
{
    var application = repositoryApps.Applications.FirstOrDefault(a => a.ApplicationID == applicationID);

    var license = new License {Application = application};
    application.Licenses.Add(license);

    return View("Edit", license);
}

public ActionResult Edit(License license)
{
    return View(license);
}

[HttpPost]
public ActionResult Save(License license)
{
    if(ModelState.IsValid)
    {
        repositoryLics.SaveLicense(license);
        TempData["message"] = string.Format("{0} has been saved", license.Name);

        return RedirectToAction("Index", "Application");
    }
    else
    {
        return View("Edit", license);
    }
}

编辑fincense的视图:

@using (Html.BeginForm("Save", "License"))
{
    @Html.EditorForModel(Model);

    <input type="submit" value="Save" class="btn btn-primary"/>

    @Html.ActionLink("Cancel", "Index", "Application", null, new {@class = "btn"})
}

我在创建新许可证时遇到问题。我正在调用操作Create并将其传递给它父ApplicationID。经过一些准备工作后,我将许可证实例传递给编辑视图,在该视图中可以编辑新创建的对象。在编辑视图(对于许可证)中,一切似乎都没问题。我有一个非空字段应用程序的许可证(我有许可证的集合)。当我提交编辑表单时,我又回到了行动保存(许可证许可证)。不幸的是,在这个地方属性Application等于null,所以我想念新创建的许可证和父应用程序之间的关系。

有人有什么建议我怎么能避免这个问题?我应该如何存储新创建的许可证对象?我会感谢任何提示或建议。

的问候,
的Grzegorz

1 个答案:

答案 0 :(得分:1)

我的ApplicationID课程中没有看到License属性!! ??

你应该添加这个属性并添加它,以便在EditorTemplate中可以隐藏,如果你想要的话。 BTW将您的License EditorTemplate添加到您的问题中,让我们了解相关信息。