我有两个具有一对多关系的简单模型
public class X{
public int id {get;set;}
public virtual Y y{ get; set; }
public string description{get;set;}
}
public class Y{
public int id{get;set;}
public string name{get;set;}
}
从实体框架我设置了关系
我正在尝试提交一个表单,用于创建包含现有X
值的新Y
记录
从表单到操作的返回数据是string description
和y_id
。
当我尝试从参数
指定对象时的操作public ActionResult sth(X x){}
将x.y
设置为null(预期...),而当我尝试以下操作时...
x.y = (from i in Y where i.id == that_id select i).first();
...
db.saveChanges();
实体框架将新的Y
记录插入数据库......
我知道我做错了什么......非常感谢你的帮助!
答案 0 :(得分:5)
查看代码,您有x和y的ID,x中的虚拟Y.除了x中的虚拟Y,您还需要引用y的id。与y中的x的虚拟ICollection一起。
public class X{
public int x_id {get;set;}
public int y_id {get;set}
public virtual Y y{ get; set; }
public string description{get;set;}
}
public class Y{
public int y_id{get;set;}
public string name{get;set;}
public virtual ICollection<X> X {get;set;}
}
这有助于实体关系。您可能还希望将y(s)列表传递给负责表单的控制器,除非您已经从表单上的下拉列表中选择了y值。
答案 1 :(得分:1)
跟踪dbContext中的Y对象似乎是一个问题。你如何生成你用linq查询的集合?你使用dbContext从数据库中获取它吗?或来自其他来源?
如果没有,则需要使用上下文或使用Attach()函数来获取它,以便正确跟踪它。
弹出另一个问题。怎么会插入一个新的Y?您是否在数据库中定义了主键?或者它是否尝试插入然后抛出异常?
这是我对此事的看法。