Guest User

EF Many-to-Many Self-Reference 2

a guest
Dec 17th, 2015
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Item.cs
  2.     public class Item
  3.     {
  4.         public Item()
  5.         {
  6.             Composites = new HashSet<ItemItem>();
  7.             Components = new HashSet<ItemItem>();
  8.         }
  9.  
  10.         public int ItemId { get; set; }
  11.  
  12.         public string Name { get; set; }
  13.  
  14.         public int Cost { get; set; }
  15.  
  16.         public virtual ICollection<ItemItem> Composites { get; set; }
  17.  
  18.         public virtual ICollection<ItemItem> Components { get; set; }
  19.  
  20.         public void AddComponent(MyContext context, Item item, [Range(1, Int32.MaxValue)] int quantity = 1)
  21.         {
  22.             var itemRelation = Components.FirstOrDefault(c => c.Composite == this);
  23.             if (itemRelation == null)
  24.             {
  25.                 itemRelation = new ItemItem() { Composite = this, Component = item, Quantity = quantity };
  26.                 this.Components.Add(itemRelation);
  27.                 item.Composites.Add(itemRelation);
  28.             }
  29.             else
  30.             {
  31.                 itemRelation.Quantity += quantity;
  32.             }
  33.         }
  34.  
  35.         public void AddComposite(MyContext context, Item item, [Range(1, Int32.MaxValue)] int quantity = 1)
  36.         {
  37.             var itemRelation = Composites.FirstOrDefault(c => c.Component == this);
  38.             if (itemRelation == null)
  39.             {
  40.                 itemRelation = new ItemItem() { Component = this, Composite = item, Quantity = quantity };
  41.                 this.Composites.Add(itemRelation);
  42.                 item.Components.Add(itemRelation);
  43.             }
  44.             else
  45.             {
  46.                 itemRelation.Quantity += quantity;
  47.             }
  48.         }
  49.     }
  50.  
  51. //ItemItem.cs
  52.     public class ItemItem
  53.     {
  54.         public ItemItem()
  55.         {
  56.  
  57.         }
  58.  
  59.         [Key]
  60.         public int RelationId { get; set; }
  61.  
  62.         public int Quantity { get; set; }
  63.  
  64.         public virtual Item Composite { get; set; }
  65.  
  66.         public virtual Item Component { get; set; }
  67.     }
  68.  
  69. //MyContext.cs
  70.     public class MyContext : DbContext
  71.     {
  72.         public MyContext()
  73.             :base("DbConnection")
  74.         { }
  75.  
  76.         public DbSet<Item> Items { get; set; }
  77.  
  78.         public DbSet<ItemItem> ItemItems { get; set; }
  79.     }
  80.  
  81. //MainWindow.xaml.cs
  82. public partial class MainWindow : Window
  83.     {
  84.         public MainWindow()
  85.         {
  86.             InitializeComponent();
  87.  
  88.             AppDomain.CurrentDomain.SetData("DataDirectory", AppDomain.CurrentDomain.BaseDirectory);
  89.         }
  90.  
  91.         private void Window_Loaded(object sender, RoutedEventArgs e)
  92.         {
  93.             Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>());
  94.  
  95.             using (MyContext context = new MyContext())
  96.             {
  97.  
  98.                 Item i1 = new Item() { Name = "Motherboard", Cost = 500 };
  99.                 Item i2 = new Item() { Name = "Network Adapter", Cost = 150 };
  100.                 Item i3 = new Item() { Name = "System Unit", Cost = 0 };
  101.  
  102.                 context.Items.Add(i1);
  103.                 context.Items.Add(i2);
  104.                 context.Items.Add(i3);
  105.  
  106.                 context.SaveChanges();
  107.  
  108.                 i3.AddComponent(context, i1);
  109.                 i3.AddComponent(context, i2);
  110.  
  111.                 context.SaveChanges();
  112.             }
  113.         }
  114.     }
Advertisement
Add Comment
Please, Sign In to add comment