我正在使用实体框架处理一对多关系:
我需要从C#对象中插入一堆数据到我的SQL Server数据库中,所以我一直在使用Entity Framework和Code First方法。
在我的示例中,我有一个产品具有一个类别,但是类别显然可以属于多个产品。
我的产品类看起来像这样。
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public Category Category { get; set; }
}
我已经为我的Category类尝试了多种解决方案,无论有没有注释过的行,但是我们开始:
public class Category
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CategoryId { get; set; }
public string CategoryName { get; set; }
// public ICollection<Product> Products { get; set; }
}
当插入具有相同类别的多个产品时,我会遇到主键约束冲突-我理解为什么会发生这种情况,但是我认为Entity Framework可以解决!
我有很长的索引列表,可用于从API获取XML文件(基于该索引)。然后,我基于该XML文件创建一个对象。该方法称为GetProductFromXML:
Foreach(int index in listOfIndexes){
Product product = GetProductFromXML(index);
productContext.Products.Add(product);
}
Context.SaveChanges();
每当我获得一个已经存在该类别的产品时,就会从我的类别表中得到一个违反主键约束的异常。
我想要的显然是EF可以理解的,第二个对象应该使用第一个对象的类别。
我该怎么办?我发现这是一个简单的操作,可以通过常规查询轻松完成,但是使用Entity Framework,我全神贯注,发疯了!
希望有人会给我逻辑答案!
答案 0 :(得分:1)
您要创建两个新的Category
实例,并明确为其赋予两个相同的CategoryId
实例。 (您实际上也没有为产品使用 实例,并且您从未在第二种产品上设置任何属性。我假设这些属性是错别字。)
仅创建一个实例:
Category category = new Category();
category.CategoryId = 1;
category.CategoryName = "categoryA";
然后将其用于您的两个Product
实例:
Product product = new Product();
product.ProductId = 1;
product.Name = "ProductA";
product.Category = category;
context.Products.Add(product);
Product productB = new Product();
productB.ProductId = 2;
productB.Name = "ProductB";
productB.Category = category;
context.Products.Add(productB);
编辑:从下面一个冗长的注释线程中(以及使新方法隐藏失败代码的更新问题),原始问题仍然存在...您正在创建新的{{1 }}实例,您应该在其中重复使用现有实例。
请考虑将其保留在方法之外的列表中。作为逻辑指导,类似以下内容:
Category
并使用您的// Note: If there are categories from previous runs of this logic
// then you should fetch them from the backing data here
var categories = new List<Category>();
foreach (int index in listOfIndexes)
{
var product = GetProductFromXML(index, categories);
productContext.Products.Add(product);
}
Context.SaveChanges();
方法:
GetProductFromXML