不确定问题的标题,反正!我的模型类RandomStuff
具有Environment
作为虚拟财产。
public class RandomStuff
{
//NOT SHOWN ON FORM HIDDEN JUST TO MAKE IT EASIER IN DB
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Newtonsoft.Json.JsonProperty]
public int JobId { get; set; }
[Required]
[ForeignKey("Environment")]
[Newtonsoft.Json.JsonProperty]
[DataMember(IsRequired = true)]
public int EnvironmentId { get; set; }
[Newtonsoft.Json.JsonProperty ]
public virtual Environment Environment { get; set; }
}
我的环境如下: -
[Newtonsoft.Json.JsonObject(Newtonsoft.Json.MemberSerialization.OptIn)]
[DataContract]
public class Environment
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Newtonsoft.Json.JsonProperty]
public int Id { get; set; }
[Required]
[Newtonsoft.Json.JsonProperty]
[DataMember(IsRequired = true)]
public string Name { get; set; }
}
现在,在我的控制器中,我有: -
public HttpResponseMessage Save(RandomStuff stuff)
{
if (ModelState.IsValid)
{
//Some stuff here
db.RandomStuffs.Add(stuff);//When this excutes, it is
//inserting data in Environment table also.
db.SaveChanges();
}
}
现在,每当我向我的RandomStuff
表添加内容时,它也会添加环境。
修改
我将尝试用我从ef-inserting-duplicate-parent-objects
获取的一般示例进行解释public class Foo
{
public int FooId {get;set;}
public virtual ICollection<Bar> Bars {get;set;}
}
public class Bar
{
public int BarId {get;set;}
public strung BarName {get;set;}
}
现在,如果上面是我的模型结构。我正在尝试将一个Foo数据添加到我的数据库中。
db.Foo.Add(new Foo{
FooId=1,
Bars=new List<Bar>(){
new Bar{
BarId=2,
BarName="Something"
}
}
})//Something of this sort will be my data, which needs to be inserted
//Now this record "new Bar{BarId=2, BarName="Something"}" is already present in DB
现在,正在发生的事情是,它在ID为1的Foo表中插入数据,并且还在ID为2的Bars表中添加了副本。
如果我使用下面的内容,我的要求也会得到满足:
db.Entry(fooModelDataComingFromSomewhere.Bars).State = EntityState.Unchanged;
答案 0 :(得分:1)
您的问题仍然不太明确,因为您现在提供的是来自其他帖子的代码段,这些帖子甚至与您遇到问题的代码的结构不同。但是,我仍然猜测你的问题是重复插入,所以我会尝试提供一个建议。
当您在实体框架数据库上下文中使用Add()
方法时,它会将连接对象的整个图形标记为已添加,即使该项已经存在于数据库中。您可能会看到的常见情况是,当您添加类型为RandomStuff
的对象时,它还添加了Environment
类型的新对象,尽管Environment.Name
是相同的,{{ 1}}是数据库分配,由于实体框架已将整个图形标记为已添加,因此它创建了一个新的Environment对象,具有相同的Environment.Id
但新的Name
。因此,您的表格中有多个Id
行具有相同的Environment
。
解决方案看似简单。由于您的Name
对象上已有一个属性来保存代表RandomStuff
对象的外键,而不是向图表中添加新的Environment
对象,只需创建您的{{1} } object并添加Environment
的值。换句话说,
而不是以这种方式创建新的RandomStuff
对象:
EnvironmentId
像这样创建:
RandomStuff