C# 实体框架|将实体添加到数据库中,其中包含其他实体

C# 实体框架|将实体添加到数据库中,其中包含其他实体,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我有这些实体 [Table("Entity")] public class Entity { public int Id { get; set; } public Products Product { get; set; } } [Table("Products")] public class Products { [Key] public int Id { get; set; } public string

我有这些实体

[Table("Entity")]
public class Entity
{
    public int Id { get; set; }
    public Products Product { get; set; }
} 

[Table("Products")]
public class Products
{
    [Key]
    public int Id { get; set; }

    public string ProductName { get; set; }
    public int Category { get; set; }

    [NotMapped]
    public string CategoryName { get; set; }
}
使用以下代码向数据库添加新实体时:

 _context.Entities.Add(someentity);
 _context.SaveChanges();
产品产品也尝试添加到数据库中。但我不想要它,因为这个实体已经存在

我尝试使用
作为notracking

var product = _context.Product.AsNoTracking().Where(x=>x.ProductId == Id).FirstOrDefault();

var entity = new Entity{Id = 1, Product = product};
_context.Entity.Add(entity );
_context.SaveChanges();
并添加虚拟

 public virtual Products Product { get; set; }

但是它不起作用。

我过去一直在努力解决这个问题。据我所知,当时并没有办法对EF说,“这个嵌套对象可能在表中,也可能不在表中。如果它的主键已经在那里,不要再尝试插入它”

解决方法是这样做:

someentity.Product = _context.Products.SingleOrDefault(p => p.Id == someEntity.Product.Id) ?? someentity.Product;
_context.Entities.Add(someentity);
_context.SaveChanges(); 

如果您从数据库中设置值,则它知道它是完全相同的对象,不会尝试将其添加进去。

添加
AsNoTracking()
会使情况变得更糟。EF必须知道它是一个已经存在的实体。您的
实体
类是否有
产品
实体外键的属性?我可以将public int ProductId属性添加到您的实体类中。。我不确定.net是如何处理产品和实体之间的隐式关系的。请将您的问题包括在内,它在执行时会生成异常。Progman外键存在。Rolando我可以使用public int ProductId,但不能使用Include()