1

无论如何,不​​确定问题的标题!我有我的模型类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

现在,正在发生的事情是,它在 Foo 表中插入 id=1 的数据,并且还在 Bars 表中添加了 id 为 2 的重复数据。

此外,如果我使用类似下面的东西,我的要求得到满足:

db.Entry(fooModelDataComingFromSomewhere.Bars).State = EntityState.Unchanged;
4

1 回答 1

1

您的问题仍然不太清楚,因为您现在提供的代码片段来自另一篇帖子,这些代码片段甚至与您遇到问题的代码结构不同。但是,我仍然猜测您的问题与重复插入有关,因此我将尝试提供建议。

当您在实体框架数据库上下文中使用方法时,它会将连接对象的整个图Add()标记为已添加,即使该项目已存在于数据库中。您可能会看到的一个常见情况是,当您添加一个类型的对象时,它也添加了一个类型的新对象,虽然相同,但已分配数据库,并且由于实体框架已将整个图标记为已添加,它创建一个新的 Environment 对象,具有相同但新的. 因此,您的表中有多行具有相同的.RandomStuffEnvironmentEnvironment.NameEnvironment.IdNameIdEnvironmentName

解决方案看似简单。由于您的RandomStuff对象已经有一个属性来保存表示该Environment对象的外键,而不是向图中添加新Environment对象,只需创建您的RandomStuff对象并添加EnvironmentId. 换句话说,

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

var RandomStuff randomStuff = new RandomStuff {
                                     Environment = new Environment {
                                                    Name = "Existing Environment"
                                                     }
                                     }

像这样创建它:

var RandomStuff randomStuff = new RandomStuff {
                                     EnvironmentId = existingEnvironment.Id
                                    }
于 2013-10-17T10:59:26.873 回答