如何避免在Entity Framework 4.3.1中重复插入 [英] How to avoid duplicate insert in Entity Framework 4.3.1
问题描述
b
public class City
{
public City()
{
Posts = new List<Post>();
}
public City(string cityName)
{
Name = cityName;
}
public virtual ICollection<Post> Posts { get; private set; }
public int Id { get; set; }
public string Name { get; private set; }
}
A 发布
类代表邮政编码和城市参考的组合
A Post
class represents combination of zip code and city reference
public class Post
{
public virtual City City { get; set; }
public int Id { get; set; }
public string ZipCode { get; set; }
}
这两个实体的上下文中定义了它们的集合作为其配置
both entities have their sets defined in context as their configurations
public DbSet<City> Cities { get; set; }
public DbSet<Post> Posts { get; set; }
modelBuilder.Configurations.Add(new CityMap());
modelBuilder.Configurations.Add(new PostMap());
public class CityMap : EntityTypeConfiguration<City>
{
public CityMap()
{
// Primary Key
HasKey(t => t.Id);
// Properties
// Table & Column Mappings
ToTable("City");
Property(t => t.Id).HasColumnName("Id");
Property(t => t.Name).HasColumnName("Name");
}
}
public class PostMap : EntityTypeConfiguration<Post>
{
public PostMap()
{
// Primary Key
HasKey(t => t.Id);
// Properties
// Table & Column Mappings
ToTable("Post");
Property(t => t.Id).HasColumnName("Id");
Property(t => t.ZipCode).HasColumnName("ZipCode");
// Relationships
HasRequired(t => t.City)
.WithMany(t => t.Posts)
.Map(map=>map.MapKey("CityId"));
}
}
我已经创建了使用这些对象进行操作的类,静态方法获取或创建对象并将其返回给调用者。
I've created class for manipulation with those objects with static methods which get or creates objects and return them to caller.
private static City GetCity(string cityName)
{
City city;
using (var db = new DbContext())
{
city = db.Cities.SingleOrDefault(c => c.Name == cityName);
if (city == null)
{
city = new City(cityName);
db.Cities.Add(city);
db.SaveChanges();
}
}
return city;
}
private static Post GetPost(string zipCode, string cityName)
{
Post post;
City city = GetCity(cityName);
using (var db = new DbContext())
{
post = db.Posts.SingleOrDefault(p => p.City.Id == city.Id && p.ZipCode == zipCode);
if (post == null)
{
post = new Post { City = city, ZipCode = zipCode };
// State of city is unchanged
db.Posts.Add(post);
// State of city is Added
db.SaveChanges();
}
}
return post;
}
想像一下,我调用方法
GetPost("11000","Prague");
方法 GetCity
已启动,如果不存在,方法创建一个城市
,然后调用 SaveChanges()
方法。
method GetCity
is started and if not exists, method creates a city
and then calls the SaveChanges()
method.
如果我将返回的 city
实体设置为新的 Post
实例,Entity Framework将生成第二个插入相同的城市
。
If I set returned city
entity to new Post
instance, Entity Framework generates a second insert for the same city
.
如何避免这种行为?我只想在上一步中创建或加载引用的 city
post c> post c
How can I avoid this behavior? I want to only insert new post
entity with referenced city
created or loaded in previous step.
推荐答案
当您将其附加到未更改的
You need to set the State
of your city when you attach it to unchanged
context.Entry(city).State = EntityState.Unchanged;
这篇关于如何避免在Entity Framework 4.3.1中重复插入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!