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