我有这些模型(1& 2):
public class Model1
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Model2> Model2s { get; set; }
}
public class Model2
{
public int Id { get; set; }
public virtual Model1 model1 { get; set; }
}
在数据库中,我已经拥有Model1的记录,Id = 1,Name =&#34; SomeName&#34; 。
当我像这样创建新的Model2时:
var item = new Model1 { Id=1, Name="SomeName" }
Model2 model2 = new Model2
{
model1 = item
}
Model2不引用数据库中的Model1,而是在数据库中创建新的Model1记录。
所以,我的问题是,在这种情况下是否可以引用退出记录而不是它现在如何做?
我可以做以下事情:
var item = context.Model1s.Find(1);
Model2 model2 = new Model2
{
model1 = item;
}
但在我的情况下,这不是一个好的选择。我想知道,我可以像第一个例子中那样做。
答案 0 :(得分:1)
如果要创建Model1
的新实例,那么它将具有Added
状态,EF将不知道数据库中存在类似的实体。
这里有两个选择
Model1
(现在拥有的内容)并将其加载到状态为Unchanged的上下文第二个选项意味着将实体附加到上下文
var item = new Model1 { Id=1, Name="SomeName" };
context.Model1s.Attach(item);
Model2 model2 = new Model2
{
model1 = item
}
您手动创建的实体不是按上下文跟踪的。当你附加这样的实体时,它将被跟踪并且它将具有Unchanged状态。您也可以手动指定实体状态
context.Entry(item).State = EntityState.Unchanged;