如何添加新对象,该对象具有已存在于数据库中的属性?

时间:2017-03-10 10:34:01

标签: c# entity-framework

我有这些模型(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;
}

但在我的情况下,这不是一个好的选择。我想知道,我可以像第一个例子中那样做。

1 个答案:

答案 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;

进一步阅读:Entity Framework Entity States