我正在开发一个EntityFramework项目并遇到一个有趣的问题。我想要做的是使用视图创建一个数据库实体,但为了做到这一点,我需要创建另一个与第一个实体需要关联的不同类型的数据库实体,我正在尝试从相同的观点。
例如,我们有一个人,每个人都会有一个定期约会。但是,约会可以在不同类型的标准上重复出现。现在我正试图让这个工作在每天的约会(例如,每周一,周三和周五),所以在这里,我的模型是这样的:
DailyAppointment实现抽象类AppointmentFrequency
人有一个与之相关的约会频率。以下是我的模型背后的代码(使用代码优先迁移生成的数据库)。
AppointmentFrequency:
public abstract class AppointmentFrequency
{
[KeyAttribute]
public int Identity { get; set; }
}
DailyAppointment:
public class DailyAppointment : AppointmentFrequency
{
public bool Monday { get; set; }
// ... Variable for each day of the week.
}
人:
public class Person
{
[Key]
public int Identity { get; set; }
//... Other information
[ForeignKey("AppointmentFrequency_Identity")]
public virtual AppointmentFrequency AppointmentFrequency { get; set; }
public int? AppointmentFrequency_Identity { get; set; }
}
因此,在我们看来,当我们创建一个Person时,我们希望与它们关联一个AppointmentFrequency。
目前,我的方法涉及视图内部创建Person的部分视图:
@using (Html.BeginForm("AddPerson", "ControllerName", FormMethod.Post, new { role = "form", @class = "form-inline" }))
{
... //This is where we get information about the Person
Model.Person.AppointmentFrequency = new DailyAppointment();
var dailyAppointment = Model.Person.AppointmentFrequency as DailyAppointment;
if (dailyFrequency != null)
{
@Html.Partial("_DailyAppointmentEditor", Model.Person.AppointmentFrequency as DailyAppointment);
}
<div class="form-group">
<button class="btn btn-primary" type="submit">Add</button>
</div>
}
(我也尝试过一些类似的方法,比如将dailyAppointment变量发送到局部视图中)
我的部分视图如下:
@model Database.Entities.DailyAppointment
@Html.LabelFor(model => model.Monday)
@Html.CheckBoxFor(model => model.Monday, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Monday, null, new { @class = "text-danger" })
@Html.LabelFor(model => model.Tuesday)
@Html.CheckBoxFor(model => model.Tuesday, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Tuesday, null, new { @class = "text-danger" })
... //The rest of the days and script bundling
在我的控制器中,我只创建一个Person,并且希望框架可以创建约会,但似乎并非如此。
[HttpPost]
public ActionResult AddPerson(Person person){
this.db.People.AddOrUpdate(person);
this.db.SaveChanges();
return this.View();
}
我知道这样做的一种方法是收集数据,然后在发送到控制器的表单中使用它,创建频率,然后添加对person对象的引用并在数据库中创建它。我实际上已经做到了,并且知道它有效,但我觉得必须有更友好的方式在框架内这样做。
这里的部分挑战是我希望在使用相同设计的同时使其具有可扩展性。如果我能提供更多信息,请告诉我,但如果您对此方法有任何建议或我采取不同的方法,我将不胜感激!谢谢。