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()