Как избежать дублирования вставки в Entity Framework 4.3.1
У меня есть небольшая модель, созданная с использованием подхода «сначала код» - классCity
который содержит только информацию о названии города.
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 Post
класс представляет собой комбинацию почтового индекса и города
public class Post
{
public virtual City City { get; set; }
public int Id { get; set; }
public string ZipCode { get; set; }
}
обе сущности имеют свои наборы, определенные в контексте как их конфигурации
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"));
}
}
Я создал класс для манипулирования этими объектами с помощью статических методов, которые получают или создают объекты и возвращают их вызывающей стороне.
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
запускается и, если не существует, метод создаетcity
а затем вызываетSaveChanges()
метод.
Если я поставил вернулcity
сущность к новомуPost
Например, Entity Framework генерирует вторую вставку для того жеcity
.
Как я могу избежать этого поведения? Я хочу только вставить новыйpost
сущность со ссылкойcity
создан или загружен в предыдущем шаге.