2016-12-11 4 views
0

DBへの別のエンティティを挿入します。製品、アイテムを(一つの製品で構成され、ノー顧客が購入されている製品の。)と、以下のようにファクター:一つのエンティティを追加しようとするだけでなく、私は3つのエンティティ持っ

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に因子を挿入すると、別の製品も製品のテーブルに追加されます!ここ は、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); 
    } 
} 

それは(私にとっては)本当に厄介です。なぜ起こったのですか?

答えて

0

'ProductConfig'は、Itemに 'product'がある場合は常に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); 
    } 
} 

あなたはそれがProductテーブルに追加されることはありませんnullにItem.Productを変更した場合。

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

本当にありがとうございます。商品クラスは商品クラスに依存します。つまり、各商品には1つ以上の商品が必要ですが、商品には該当しません。商品と商品の関係は正しいのですか? – Xeta7

0

問題は、FactorオブジェクトがEFに戻ってきたメモリ内の製品への参照を持つ可能性が高いことです。そこで、EFはこれを新しい製品として解釈し、それを要因と一緒に追加しています。あなたが..

  1. 追加している要因と一緒にメモリ内の人口の製品を渡すとID
  2. を使用して、それをリンクしないためにどちらかの必要

    は、あなたが添付したい既存の製品をロードしていることを確認しますセーブする前にトラッキングすることで、データベースからの要因となる。

私はhttps://msdn.microsoft.com/en-gb/magazine/dn166926.aspxが役に立ったと思います。

+0

親愛なるgrrrrrrrrrrrrr、ありがとうございます。私はこれがあなたが送る第1のメモに起因すると思う。どのように私はメモリに人口の多い製品を削除する必要がありますか? – Xeta7

+0

EFの他のエンティティを参照するためにIdを使用する方法を調べる必要があります。彼らは大規模に状況を簡素化します。私はhttps://msdn.microsoft.com/en-gb/magazine/dn166926.aspxがもっと説明すると思います。 – gmn

関連する問題