62,243
社区成员




[Table("T_Teacher")]
public class Teacher
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public List<Student> Students { get; set; }
}
[Table("T_Student")]
public class Student
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int TeacherId { get; set; }
[ForeignKey("TeacherId")]
public Teacher Teacher { get; set; }
}
public class SchoolContext : DbContext
{
public SchoolContext()
: base("MvcSchool")
{
}
public DbSet<Teacher> Teacher { get; set; }
public DbSet<Student> Student { get; set; }
}
@model MvcSchool.Models.Teacher
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Teacher</legend>
<div class="editor-label">
老师
</div>
<div class="editor-field">
@Html.HiddenFor(model => model.Id)
@Html.TextBoxFor(model => model.Name)
</div>
<div class="editor-label">
学生
</div>
@for (int i = 0; i < Model.Students.Count; i++)
{
<div class="editor-field">
@Html.HiddenFor(model => Model.Students[i].Id)
@Html.TextBoxFor(model => Model.Students[i].Name)
<a href="javascript: void(0)" onclick="deleteTr(this)">删除</a>
</div>
}
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
<script>
function deleteTr(e) {
$(e).parent().remove();
}
</script>
}
public ActionResult Index()
{
Teacher teacher;
using (var context = new SchoolContext())
{
teacher = context.Teacher.Include("Students").FirstOrDefault();
if (teacher == null)//如果没有数据,添加几条测试数据
{
teacher = new Teacher()
{
Name = "张老师",
Students = new List<Student>()
{
new Student() {Name = "小明"},
new Student() {Name = "小花"},
new Student() {Name = "丽丽"}
}
};
context.Teacher.Add(teacher);//这里可以正常保存
context.SaveChanges();
}
}
return View(teacher);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(Teacher teacher)
{
using (var context = new SchoolContext())
{
// var model = context.Teacher.Include("Students").First(m => m.Id == teacher.Id);
//TryUpdateModel(model);
context.Teacher.Attach(teacher);
context.Entry(teacher).State = EntityState.Modified;
context.SaveChanges();
}
return View(teacher);
}
参考这篇文章 http://jameszou.blog.51cto.com/2173852/1152743,有两种方法,你可以根据需要来决定采用哪种方法
[quote=引用 3 楼 wyumening 的回复:] 错误很明显了,定义约束引用的属性值不一致,你的问题是ef修改方面的问题了,假设控制器中获得的方法参数为List<user> 那么你可以用foreach循环这个列表,用where操作符进行筛选,已经存在在数据库中的就修改,不存在的就添加,最后用SaveChanges方法保存
错误很明显了,定义约束引用的属性值不一致,你的问题是ef修改方面的问题了,假设控制器中获得的方法参数为List<user>
那么你可以用foreach循环这个列表,用where操作符进行筛选,已经存在在数据库中的就修改,不存在的就添加,最后用SaveChanges方法保存
public Teacher Teacher { get; set; } public List<Student> Students { get; set; } 这里加上virsual试试吧....
EF里的修改 必须先获取再修改,明白?
Teacher teacher = context.Teacher.Include("Students").First(m => m.Id == teacher.Id);
,
的确是可以获取到数据库的teacher和其对应的students,我现在需要的是,如何修改他们还能保存到数据库中