ASP.NET如何在Controller中向关联表(中间表)保存数据?
解决ASP.NET Controller中向关联表保存数据的问题
你现在遇到的核心问题是:虽然代码里分别添加了KreatorZamowien和Nabywca实体,但EF并没有自动填充中间的关联表NabywcaKreatorzamowien——这是因为你没在两个实体之间建立导航属性关联,EF只有检测到实体间的引用关系时,才会自动生成关联表的记录。
问题根源分析
你的当前代码只是单独将两个实体加入上下文,但它们之间没有任何关联绑定:
public ActionResult Create(KreatorZamowienNabywca model) { db.KreatoryZamowien.Add(model.KreatorZamowien); db.Nabywcy.Add(model.Nabywca); db.SaveChanges(); }
EF无法识别这两个新实体属于同一组关联,自然不会向中间表插入数据。
解决方案:建立实体间的关联
你需要利用实体类中定义的导航属性,把Nabywca添加到KreatorZamowien的Nabywcy集合中(或者反过来),这样EF就能自动处理中间表的插入操作。
情况1:两个实体都是全新创建的
如果KreatorZamowien和Nabywca都是本次请求中新生成的,修改Create方法如下:
public ActionResult Create(KreatorZamowienNabywca model) { // 初始化导航集合(避免空引用异常) if (model.KreatorZamowien.Nabywcy == null) { model.KreatorZamowien.Nabywcy = new List<Nabywca>(); } // 将Nabywca绑定到KreatorZamowien的关联集合 model.KreatorZamowien.Nabywcy.Add(model.Nabywca); // 只需添加主实体,EF会自动处理关联的Nabywca和中间表 db.KreatoryZamowien.Add(model.KreatorZamowien); db.SaveChanges(); }
这里不需要单独调用db.Nabywcy.Add(model.Nabywca),因为当你把Nabywca加入KreatorZamowien的关联集合后,EF会自动将Nabywca标记为Added状态,同时生成中间表的关联记录。
情况2:Nabywca是已存在的实体(比如从下拉选择)
如果Nabywca是数据库中已有的记录(比如用户从下拉列表选择了一个现有客户),需要先将Nabywca附加到上下文,再建立关联:
public ActionResult Create(KreatorZamowienNabywca model) { // 附加已存在的Nabywca到上下文,避免重复插入 db.Nabywcy.Attach(model.Nabywca); // 初始化导航集合 if (model.KreatorZamowien.Nabywcy == null) { model.KreatorZamowien.Nabywcy = new List<Nabywca>(); } // 添加关联 model.KreatorZamowien.Nabywcy.Add(model.Nabywca); db.KreatoryZamowien.Add(model.KreatorZamowien); db.SaveChanges(); }
这种情况下,EF只会插入KreatorZamowien和中间表的关联记录,不会重复添加Nabywca。
额外优化:实体类初始化导航集合
为了避免空引用异常,建议在实体类的构造函数中提前初始化导航集合:
public class KreatorZamowien { public KreatorZamowien() { Nabywcy = new List<Nabywca>(); } public int Id { get; set; } public int NumerZamowienia { get; set; } public virtual ICollection<Nabywca> Nabywcy { get; set; } } public class Nabywca { public Nabywca() { KreatoryZamowien = new List<KreatorZamowien>(); } public int NabywcaId { get; set; } public string Nazwa { get; set; } public virtual ICollection<KreatorZamowien> KreatoryZamowien { get; set; } }
这样就不用在Controller中每次都检查集合是否为null了。
内容的提问来源于stack exchange,提问作者BartusZak
相关产品推荐
相关产品推荐

