当前位置: 代码迷 >> .NET Framework >> 请问一个关于EF构架下使用了foreignkey后的数据插入或更新有关问题
  详细解决方案

请问一个关于EF构架下使用了foreignkey后的数据插入或更新有关问题

热度:94   发布时间:2016-05-01 23:35:32.0
请教一个关于EF构架下使用了foreignkey后的数据插入或更新问题

public class Category
    {
        public int Id{ get; set; }
        public string Name { get; set; }
    }

public class Product
    {
        public int Id{ get; set; }
        public string Name { get; set; }
        public virtual Category Category { get; set; }
    }

//Fuent Api 映射
public ProductMap()
        {
            ToTable("Product");
            HasKey(p => p.Id).Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            HasOptional(p => p.Category).WillCascadeOnDelete(false);
        }


如上两张简单的表,在Product表中,EF创建了一个ForeignKey指向Category表。现在的问题是,无论我在Product表中执行插入或更新操作,都会在Category表中插入一条数据,而无论这条数据在Category中是否存在。
比如:

            IProductService productRepository = new ProductService();
            var product = new Product()
            {
                Name = "111",
                Category = new Category() { Name="aaa"}
            };
            productRepository.Insert(product);

以上代码,在Product表中插入数据的同时,在Category也插入了数据。

另外:

            IProductService productRepository = new ProductService();
            var categoryRepository = new RepositoryService<Category>(context);
            var product = new Product()
            {
                Name = "111",
                Category = categoryRepository.GetById(4);
            };
            productRepository.Insert(product);

这种情况,我将Category表中的已有数据取出赋值给product,按理说Category 数据是存在的,但是也会插入一条一模一样的数据(除了Id不一样)。

另外我执行Update操作也是一样,代码都类似。请教各位高手这是怎么回事?能让不联动插入或重复插入数据吗?谢谢。
------解决方案--------------------
参考:

防止Entity Framework重复插入关联对象
www.cnblogs.com/killmyday/archive/2010/12/17/1909630.html
------解决方案--------------------
你的Category属性在Product中应该有对应的CategoryId属性吧。
你试试不改写Category,而是改写CategoryID。这样就不会插入重复的Category了。最多会因为CateogryID不在Category表而报错。

 var product = new Product()
            {
                Name = "111",
                CategoryId = 4;// categoryRepository.GetById(4);
            };