Asp.net 通过asp MVC3 EntityFramework进行简单插入

Asp.net 通过asp MVC3 EntityFramework进行简单插入,asp.net,asp.net-mvc-3,entity-framework,Asp.net,Asp.net Mvc 3,Entity Framework,我有两个简单的模型,它们有一个多个关系 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;} } 从实体框架中,我设置了关系 我正在尝试提交一个表单,该表单使用现有的Y值创

我有两个简单的模型,它们有一个多个关系

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;}
}
从实体框架中,我设置了关系

我正在尝试提交一个表单,该表单使用现有的
Y
值创建一个新的
X
记录

从表单返回到操作的数据是
字符串描述
y\u 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
记录


我知道我做错了什么。。。非常感谢您的帮助

查看代码,您有一个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;}
}
公共类X{
公共int x_id{get;set;}
公共int y_id{get;set}
公共虚拟Y{get;set;}
公共字符串说明{get;set;}
}
公共Y类{
公共int y_id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection X{get;set;}
}

这有助于实体中的关系。您可能还希望将y列表传递给负责表单的控制器,除非您已经从表单上的下拉列表中选择了y值。

查看代码,您有一个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;}
}
公共类X{
公共int x_id{get;set;}
公共int y_id{get;set}
公共虚拟Y{get;set;}
公共字符串说明{get;set;}
}
公共Y类{
公共int y_id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection X{get;set;}
}

这有助于实体中的关系。您可能还希望将y列表传递给负责表单的控制器,除非您已经从表单上的下拉列表中选择了y值。

在dbContext中跟踪y对象似乎有问题。如何生成使用linq查询的集合?您是否使用dbContext从数据库中获取它?还是从其他渠道

如果没有,则需要使用上下文或Attach()函数获取它,以便正确跟踪它

另一个问题出现了。为什么要插入新的Y?数据库中没有定义主键吗?还是尝试插入,然后抛出异常


这是我对这件事的看法。

在dbContext中跟踪Y对象似乎是个问题。如何生成使用linq查询的集合?您是否使用dbContext从数据库中获取它?还是从其他渠道

如果没有,则需要使用上下文或Attach()函数获取它,以便正确跟踪它

另一个问题出现了。为什么要插入新的Y?数据库中没有定义主键吗?还是尝试插入,然后抛出异常


这是我对这件事的看法。

先生,当我做以下工作时,迁移脚本打算将该列从
(“y\u id”)
重命名为
(“y\u id1”)
,并添加一个名为
“y\u id”
的新列,该列在迁移方面还没有太多经验,尽管根据应用程序所处的阶段,您可能希望在更改模型时删除并重新创建数据库,但它有助于快速开发并避免迁移,直到达到部署阶段。应该告诉你怎么做。先生,我的数据库有大量的数据,我不能在每一个变化做娱乐和重新填充数据库,如果你不同意,请告诉我。嗯,公平点。我不确定我是否害怕迁移。我的答案代表这个问题,但是,最好的,如果不是唯一的方式,获得您需要的关系是存储在X的Y的id。自动生成的视图和控制器应该使它非常简单,分配Ys值给X。作为一个备份计划,我将使用这个。。。但我只是想再检查一下是否还有其他方法。。。非常感谢,先生,非常感谢您的时间……先生,当我完成以下操作时,迁移脚本将把列从
(“y\u id”)
重命名为
(“y\u id1”)
,并添加一个名为
“y\u id”
的新列,该列在迁移方面还没有太多经验,尽管根据应用程序所处的阶段,您可能希望在更改模型时删除并重新创建数据库,但它有助于快速开发并避免迁移,直到达到部署阶段。应该告诉你怎么做。先生,我的数据库有大量的数据,我不能在每一个变化做娱乐和重新填充数据库,如果你不同意,请告诉我。嗯,公平点。我不确定我是否害怕迁移。我的答案代表这个问题,但是,最好的,如果不是唯一的方式,获得您需要的关系是存储在X的Y的id。自动生成的视图和控制器应该使它非常简单,分配Ys值给X。作为一个备份计划,我将使用这个。。。但我只是想再检查一下是否还有其他方法。。。非常感谢先生,非常感谢您的时间…先生,
y
是由linq查询从同一数据库上下文生成的,对于插入,ID is db identity被替换为一个新的ID。。。我将尝试attach方法,看看会发生什么,attach方法工作得很好,您能告诉我为什么会出现此问题吗?是因为
y
是虚拟成员(它没有连接到controller db上下文)?非常感谢,先生,
y
是由linq查询从同一个db上下文生成的,对于插入,ID is db identity被替换为一个新的ID。。。我会试试附加方法,看看会发生什么。附加方法工作得很好,你能告诉我为什么会发生这个问题吗