我使用EF6代码第一种方法,我有3个表:
我在产品表中已经添加了很少的产品,现在我想要添加新的促销优惠,我应该能够将一些产品(超过1个)链接到promotionofferproducts,但在我的情况下它添加新产品
这是我的实体
产品
public class Product
{
[Key]
public long ProductId { get; set; }
[Required, StringLength(100)]
public string Name { get; set; }
}
PromotionalOffer
public class PromotionalOffer
{
[Key]
public long PromotionalOfferID { get; set; }
[Required]
[StringLength(100)]
public string Name { get; set; }
public virtual List<Product> Products { get; set; }
public void Add()
{
db.PromotionalOffers.Add(this);
db.SaveChanges();
}
}
第3张表是由EF根据PromotionalOffer类中的List<Product> products
自动创建的。
以下是我的客户代码:
IPromotionalOffer pOffer = Factory.Instance.Create<IPromotionalOffer>();
Domain.Product p = new Domain.Product
{
ProductId = 1,
Name = "Colgate",
};
pOffer.Name = "Holi";
pOffer.Products.Add(p);
pOffer.Add();
虽然这会在PromotionalOfferProducts中添加条目,但它也会在Products表中创建条目(尽管它不应该添加到Product表中)。
答案 0 :(得分:2)
问题是您要添加新产品 因为您创建了一个新的Product实例,而不是使用现有的实例。
因此,要解决此问题,请使用entityframework加载您的产品,而不是实例化您自己的产品实例。
所以在一般的实体框架术语中,如果你没有使用依赖注入容器,就像这样:
<table height="100%">
原因是,您的实体类实际上并未直接由entityframework使用,entityframework继承自您的产品类并创建自己的类,它可以添加更多属性,以便跟踪实体。如果您自己创建一个新实例,则entityframework无法跟踪它,因此假设它是一个新产品而不是现有产品,因为它正在跟踪正在加载的现有产品。
更理想的情况是,我认为您需要更改实体映射,以便您可以反过来这样做,从而从实体框架加载您的产品,然后在您的产品中添加promotionalOffer,而不是在促销中添加产品报价。