如何避免在Entity Framework 4.3.1中重复插入 [英] How to avoid duplicate insert in Entity Framework 4.3.1

查看:83
本文介绍了如何避免在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆