So vermeiden Sie doppelte Einfügungen in Entity Framework 4.3.1

Ich habe ein kleines Modell erstellt mit Code-First-Ansatz - eine KlasseCity die nur Informationen über den Namen der Stadt enthält.

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 Klasse steht für eine Kombination aus Postleitzahl und Stadtbezug

public class Post
{
    public virtual City City { get; set; }        
    public int Id { get; set; }
    public string ZipCode { get; set; }        
}

Bei beiden Entitäten sind die Mengen im Kontext als ihre Konfigurationen definiert

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"));
    }
}

Ich habe eine Klasse für die Manipulation mit diesen Objekten mit statischen Methoden erstellt, die Objekte abrufen oder erstellen und sie an den Aufrufer zurückgeben.

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;
    }

Stellen Sie sich vor, ich rufe method auf

GetPost("11000","Prague");

MethodeGetCity wird gestartet und falls nicht vorhanden, erstellt die Methode einecity und ruft dann dieSaveChanges() Methode.

Wenn ich zurückkehrecity Einheit zu neuemPost Beispiel: Entity Framework generiert eine zweite Einfügung für dieselbecity.

Wie kann ich dieses Verhalten vermeiden? Ich möchte nur neue einfügenpost Entität mit referenziertencity im vorherigen Schritt erstellt oder geladen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage