2016-12-11 4 views
0

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; } 
} 

엔티티 사이의 관계는 다음과 같습니다 : 1 - 제품 품목에서> 1 * -> * 항목 팩터에서

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에 요소를 삽입하면 다른 제품도 제품 테이블에 추가됩니다 !!!

[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); 
    } 
} 

그것은 (나에게) 정말 어색 : 여기에 DB에 요소를 삽입하기위한 코드입니다. 왜 일어 났습니까?

답변

0

'ProductConfig'는 Item에 'product'가있을 때마다 Product 테이블에 추가되어야한다고 말합니다. 다음은 수정 된 코드입니다. 당신이 제품 테이블에 추가하지 않습니다 다음 null로 Item.Product을 변경하는 경우

ProductConfig 클래스

public class ProductConfig : EntityTypeConfiguration<Product> 
{ 
    public ProductConfig() 
    { 
     // one to one relationship between product and item 
     HasOptional(p => p.Item).WithOptionalDependent(i => i.Product); 
    } 
} 

.

foreach (Item item in purchasedItems) 
     { 
      if (item.Product != null) 
      { 
       factor.Items.Add(item); 
       item.Product = null;//Setting Product to null 
      } 
     } 
+0

귀하의 회신에 정말로 감사드립니다. 상품 클래스는 상품 클래스에 따라 다릅니다. 즉, 각 품목에는 하나 이상의 제품이 있어야하지만 제품에는 해당되지 않습니다. 제품과 제품 간의 내 관계가 맞습니까? – Xeta7

0

Factor 개체가 EF로 다시 전달하는 메모리에있는 제품에 대한 참조를 가지고있을 가능성이 있습니다. 그래서 EF는 이것을 이것을 새로운 제품으로 해석하고 그것을 요인과 함께 추가합니다.

당신은 당신이를 첨부 할

  • 기존 제품을로드 있는지 확인 중 ..

    1. 이 ID를 추가하는 요소와 함께 메모리에 채워진 제품을 전달하고 사용하여 연결하지 필요 저장하기 전에 추적을 통해 데이터베이스에서 인수를 구하십시오.

    생각해 보면 https://msdn.microsoft.com/en-gb/magazine/dn166926.aspx이 도움이 될 수 있습니다.

  • +0

    안녕하세요. grrrrrrrrrrrrr, 좋은 반응에 감사드립니다. 나는 이것이 당신이 보낸 첫 번째 메모에 의한 것이라고 생각합니다. 그러나 메모리에 꽉 차있는 제품을 어떻게 제거해야합니까? – Xeta7

    +0

    EF에서 다른 항목을 참조하기 위해 ID를 사용해야합니다. 그들은 상황을 대폭 단순화합니다. 나는 https://msdn.microsoft.com/en-gb/magazine/dn166926.aspx가 더 설명 할 것이라고 생각한다. – gmn