试图添加一个实体,但也将另一个实体插入数据库
trying to add one entity, but also insert another entity to db
我有三个实体:产品、项目(由一个产品和客户购买的产品编号组成)和因素如下:
public class Factor
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual int FactorId { get; set; }
[Required]
public virtual System.Guid TrackingCode { set; get; }
[StringLength(1000)]
public string StatusOfFactor { set; get; }
[Required, DataType(DataType.EmailAddress), StringLength(200)]
public string EmailOfFactor { set; get; }
// price before discount
public virtual double PriceOfFactor { set; get; }
public virtual double DiscountOfFactor { set; get; }
[StringLength(3000,MinimumLength =0)]
public virtual string GeneralDescription { set; get; }
public virtual List<Item> Items { set; get; }
}
public class Item
{
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ItemId { set; get; }
public int Count { set; get; }
// 1 -> 1 relationship between product and Item
public virtual Product Product { set; get; }
// * -> * relationship between Item and Factor
public virtual List<Factor> Factors { set; get; }
}
public class Product
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual int ProductId { set; get; }
[Required]
[StringLength(128)]
public virtual string NameFa { set; get; }
[Required]
[Range(0, 990000000)]
public virtual double Price { set; get; }
// many->many relationship category and product
public virtual List<Category> Categories { set; get; }
//public virtual List<Factor> Factors { get; set; }
public virtual Item Item { set; get; }
}
实体之间的关系如下:
Product-Item 中的 1 -> 1 和 Item-Factor 中的 * -> *
public class ProductConfig:EntityTypeConfiguration<Product>
{
public ProductConfig() {
// one to one relationship between product and item
HasOptional(p => p.Item).WithRequired(i => i.Product);
}
}
和
public class FactorConfig : EntityTypeConfiguration<Factor>
{
public FactorConfig( ) {
HasMany(p => p.Items)
.WithMany(p => p.Factors)
.Map(c => {
c.ToTable("ItemsFactors");
c.MapLeftKey("FactorID");
c.MapRightKey("ItemID");
});
}
}
当我向 db 中插入一个因子时,另一个产品也添加到 table 的产品中!!!
这是将因子插入数据库的代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RegisterFactor( [Bind(Include = "FactorId,TrackingCode,RegistrationDate,PaymentSucceed,PaymentIdOfBank,PaymentDate,StatusOfFactor,EmailOfFactor,TranmissionSucceed,TransmissionDate,PriceOfFactor,DiscountOfFactor,GeneralDescription,IsReturned,ReturnedDate,ReturnedDescription")]Factor factor )
{
{
// Session consist of Items and Items consist of Products
List<Item> purchasedItems =
(List<Item>)Session[Constants.SHOPPINGBAG];
double totalPriceBeforeDiscount = 0.0d;
double totalDiscount = 0.0d;
double totalPriceAfterDiscount = 0.0;
//
Guid trackingCode = Guid.NewGuid();
factor.Items = new List<Item>();
if ( purchasedItems == null )
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
foreach ( Item item in purchasedItems )
{
if ( item.Product != null )
{
factor.Items.Add(item);
}
}
// allocate data to factor
factor.PriceOfFactor = totalPriceBeforeDiscount;
factor.DiscountOfFactor = totalDiscount;
factor.PaymentDate = DateTime.Now;
factor.RegistrationDate = DateTime.Now;
factor.TrackingCode = trackingCode;
if ( ModelState.IsValid )
{
//db.Factors.AsNoTracking();
db.Products.AsNoTracking();
db.Factors.Add(factor);
db.SaveChanges();
EmptyShoppingCart();
return View("RegisterFactorSucceed", factor);
}
return View(factor);
}
}
真的很别扭(对我来说)。为什么会这样?
问题很可能是您的 Factor 对象引用了内存中的某个产品,您正在将其传递回 EF。因此 EF 将其解释为新产品并将其与因子一起添加。
您需要...
- 不传递内存中已填充的产品以及您要添加的因素,link它使用 ID
- 确保在保存之前从数据库加载要附加该因素的现有产品并进行跟踪。
我认为 https://msdn.microsoft.com/en-gb/magazine/dn166926.aspx 可能会有帮助。
你的 'ProductConfig' 是说,只要项目有 'product',那么就应该将其添加到产品 table 中。这是修改后的代码。
产品配置class
public class ProductConfig : EntityTypeConfiguration<Product>
{
public ProductConfig()
{
// one to one relationship between product and item
HasOptional(p => p.Item).WithOptionalDependent(i => i.Product);
}
}
如果您将 Item.Product 更改为 null,则它不会添加到产品 table。
foreach (Item item in purchasedItems)
{
if (item.Product != null)
{
factor.Items.Add(item);
item.Product = null;//Setting Product to null
}
}
我有三个实体:产品、项目(由一个产品和客户购买的产品编号组成)和因素如下:
public class Factor
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual int FactorId { get; set; }
[Required]
public virtual System.Guid TrackingCode { set; get; }
[StringLength(1000)]
public string StatusOfFactor { set; get; }
[Required, DataType(DataType.EmailAddress), StringLength(200)]
public string EmailOfFactor { set; get; }
// price before discount
public virtual double PriceOfFactor { set; get; }
public virtual double DiscountOfFactor { set; get; }
[StringLength(3000,MinimumLength =0)]
public virtual string GeneralDescription { set; get; }
public virtual List<Item> Items { set; get; }
}
public class Item
{
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ItemId { set; get; }
public int Count { set; get; }
// 1 -> 1 relationship between product and Item
public virtual Product Product { set; get; }
// * -> * relationship between Item and Factor
public virtual List<Factor> Factors { set; get; }
}
public class Product
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual int ProductId { set; get; }
[Required]
[StringLength(128)]
public virtual string NameFa { set; get; }
[Required]
[Range(0, 990000000)]
public virtual double Price { set; get; }
// many->many relationship category and product
public virtual List<Category> Categories { set; get; }
//public virtual List<Factor> Factors { get; set; }
public virtual Item Item { set; get; }
}
实体之间的关系如下: Product-Item 中的 1 -> 1 和 Item-Factor 中的 * -> *
public class ProductConfig:EntityTypeConfiguration<Product>
{
public ProductConfig() {
// one to one relationship between product and item
HasOptional(p => p.Item).WithRequired(i => i.Product);
}
}
和
public class FactorConfig : EntityTypeConfiguration<Factor>
{
public FactorConfig( ) {
HasMany(p => p.Items)
.WithMany(p => p.Factors)
.Map(c => {
c.ToTable("ItemsFactors");
c.MapLeftKey("FactorID");
c.MapRightKey("ItemID");
});
}
}
当我向 db 中插入一个因子时,另一个产品也添加到 table 的产品中!!! 这是将因子插入数据库的代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RegisterFactor( [Bind(Include = "FactorId,TrackingCode,RegistrationDate,PaymentSucceed,PaymentIdOfBank,PaymentDate,StatusOfFactor,EmailOfFactor,TranmissionSucceed,TransmissionDate,PriceOfFactor,DiscountOfFactor,GeneralDescription,IsReturned,ReturnedDate,ReturnedDescription")]Factor factor )
{
{
// Session consist of Items and Items consist of Products
List<Item> purchasedItems =
(List<Item>)Session[Constants.SHOPPINGBAG];
double totalPriceBeforeDiscount = 0.0d;
double totalDiscount = 0.0d;
double totalPriceAfterDiscount = 0.0;
//
Guid trackingCode = Guid.NewGuid();
factor.Items = new List<Item>();
if ( purchasedItems == null )
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
foreach ( Item item in purchasedItems )
{
if ( item.Product != null )
{
factor.Items.Add(item);
}
}
// allocate data to factor
factor.PriceOfFactor = totalPriceBeforeDiscount;
factor.DiscountOfFactor = totalDiscount;
factor.PaymentDate = DateTime.Now;
factor.RegistrationDate = DateTime.Now;
factor.TrackingCode = trackingCode;
if ( ModelState.IsValid )
{
//db.Factors.AsNoTracking();
db.Products.AsNoTracking();
db.Factors.Add(factor);
db.SaveChanges();
EmptyShoppingCart();
return View("RegisterFactorSucceed", factor);
}
return View(factor);
}
}
真的很别扭(对我来说)。为什么会这样?
问题很可能是您的 Factor 对象引用了内存中的某个产品,您正在将其传递回 EF。因此 EF 将其解释为新产品并将其与因子一起添加。
您需要...
- 不传递内存中已填充的产品以及您要添加的因素,link它使用 ID
- 确保在保存之前从数据库加载要附加该因素的现有产品并进行跟踪。
我认为 https://msdn.microsoft.com/en-gb/magazine/dn166926.aspx 可能会有帮助。
你的 'ProductConfig' 是说,只要项目有 'product',那么就应该将其添加到产品 table 中。这是修改后的代码。
产品配置class
public class ProductConfig : EntityTypeConfiguration<Product>
{
public ProductConfig()
{
// one to one relationship between product and item
HasOptional(p => p.Item).WithOptionalDependent(i => i.Product);
}
}
如果您将 Item.Product 更改为 null,则它不会添加到产品 table。
foreach (Item item in purchasedItems)
{
if (item.Product != null)
{
factor.Items.Add(item);
item.Product = null;//Setting Product to null
}
}