实体框架:一对多?

时间:2020-01-30 15:00:01

标签: c# frameworks entity

我正在使用实体框架处理一对多关系:

我需要从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,我全神贯注,发疯了!

希望有人会给我逻辑答案!

1 个答案:

答案 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