实体框架 - 虚拟财产在相应的表中插入数据

时间:2013-10-16 12:16:58

标签: entity-framework

不确定问题的标题,反正!我的模型类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;

1 个答案:

答案 0 :(得分:1)

您的问题仍然不太明确,因为您现在提供的是来自其他帖子的代码段,这些帖子甚至与您遇到问题的代码的结构不同。但是,我仍然猜测你的问题是重复插入,所以我会尝试提供一个建议。

当您在实体框架数据库上下文中使用Add()方法时,它会将连接对象的整个图形标记为已添加,即使该项已经存在于数据库中。您可能会看到的常见情况是,当您添加类型为RandomStuff的对象时,它还添加了Environment类型的新对象,尽管Environment.Name是相同的,{{ 1}}是数据库分配,由于实体框架已将整个图形标记为已添加,因此它创建了一个新的Environment对象,具有相同的Environment.Id但新的Name。因此,您的表格中有多个Id行具有相同的Environment

解决方案看似简单。由于您的Name对象上已有一个属性来保存代表RandomStuff对象的外键,而不是向图表中添加新的Environment对象,只需创建您的{{1} } object并添加Environment的值。换句话说,

而不是以这种方式创建新的RandomStuff对象:

EnvironmentId

像这样创建:

RandomStuff