Click here to Skip to main content
15,881,600 members
Articles / Programming Languages / C#

The Power of a POC

Rate me:
Please Sign up or sign in to vote.
4.42/5 (6 votes)
26 Apr 2011CPOL13 min read 49.9K   358   19  
The importance of creating a POC as the first step to your next adventure
using System;
using System.Collections.Generic;
using System.Data.Objects;
using System.Linq;
using System.Runtime.Serialization;

using EntityModel = AdventureWorksEntityModel;


namespace AdventureWorksModel
{
    [DataContract(IsReference = true)]
    public partial class Product : PocoBase, IExtensibleDataObject
    {
   		// Class Name
		public const string PRODUCT = "Product";
		
		// Property Names
        public const string PRODUCT_ID = "ProductID";
        public const string CLASS = "Class";
        public const string COLOR = "Color";
        public const string DAYS_TO_MANUFACTURE = "DaysToManufacture";
        public const string DISCONTINUED_DATE = "DiscontinuedDate";
        public const string FINISHED_GOODS_FLAG = "FinishedGoodsFlag";
        public const string LIST_PRICE = "ListPrice";
        public const string MAKE_FLAG = "MakeFlag";
        public const string MODIFIED_DATE = "ModifiedDate";
        public const string NAME = "Name";
        public const string PRODUCT_LINE = "ProductLine";
        public const string PRODUCT_NUMBER = "ProductNumber";
        public const string REORDER_POINT = "ReorderPoint";
        public const string ROWGUID = "rowguid";
        public const string SAFETY_STOCK_LEVEL = "SafetyStockLevel";
        public const string SELL_END_DATE = "SellEndDate";
        public const string SELL_START_DATE = "SellStartDate";
        public const string SIZE = "Size";
        public const string SIZE_UNIT_MEASURE_CODE = "SizeUnitMeasureCode";
        public const string STANDARD_COST = "StandardCost";
        public const string STYLE = "Style";
        public const string WEIGHT = "Weight";
        public const string WEIGHT_UNIT_MEASURE_CODE = "WeightUnitMeasureCode";

		// Data Members - Keys
        [DataMember(EmitDefaultValue = false)] public Int32 ProductID { get; private set; }

		// Data Members
        [DataMember(EmitDefaultValue = false)] public String Class { get; set; }
        [DataMember(EmitDefaultValue = false)] public String Color { get; set; }
        [DataMember(EmitDefaultValue = false)] public Int32 DaysToManufacture { get; set; }
        [DataMember(EmitDefaultValue = false)] public DateTime? DiscontinuedDate { get; set; }
        [DataMember(EmitDefaultValue = false)] public Boolean FinishedGoodsFlag { get; set; }
        [DataMember(EmitDefaultValue = false)] public Decimal ListPrice { get; set; }
        [DataMember(EmitDefaultValue = false)] public Boolean MakeFlag { get; set; }
        [DataMember(EmitDefaultValue = false)] public DateTime ModifiedDate { get; set; }
        [DataMember(EmitDefaultValue = false)] public String Name { get; set; }
        [DataMember(EmitDefaultValue = false)] public String ProductLine { get; set; }
        [DataMember(EmitDefaultValue = false)] public String ProductNumber { get; set; }
        [DataMember(EmitDefaultValue = false)] public Int16 ReorderPoint { get; set; }
        [DataMember(EmitDefaultValue = false)] public Guid rowguid { get; set; }
        [DataMember(EmitDefaultValue = false)] public Int16 SafetyStockLevel { get; set; }
        [DataMember(EmitDefaultValue = false)] public DateTime? SellEndDate { get; set; }
        [DataMember(EmitDefaultValue = false)] public DateTime SellStartDate { get; set; }
        [DataMember(EmitDefaultValue = false)] public String Size { get; set; }
        [DataMember(EmitDefaultValue = false)] public String SizeUnitMeasureCode { get; set; }
        [DataMember(EmitDefaultValue = false)] public Decimal StandardCost { get; set; }
        [DataMember(EmitDefaultValue = false)] public String Style { get; set; }
        [DataMember(EmitDefaultValue = false)] public Decimal? Weight { get; set; }
        [DataMember(EmitDefaultValue = false)] public String WeightUnitMeasureCode { get; set; }

		// Reference (FK) to other Table (PK)	
		[DataMember(EmitDefaultValue = false)] public ProductModel ProductModel { get; set; }
		[DataMember(EmitDefaultValue = false)] public PocoReference<ProductModel> ProductModelReference { get; set; }
		
		[DataMember(EmitDefaultValue = false)] public ProductSubcategory ProductSubcategory { get; set; }
		[DataMember(EmitDefaultValue = false)] public PocoReference<ProductSubcategory> ProductSubcategoryReference { get; set; }
		
		// References back to Product
        [DataMember(EmitDefaultValue = false)] public IList<ProductDocument> ProductDocument { get; set; }
        [DataMember(EmitDefaultValue = false)] public IList<ProductProductPhoto> ProductProductPhoto { get; set; }
        [DataMember(EmitDefaultValue = false)] public IList<PurchaseOrderDetail> PurchaseOrderDetail { get; set; }
        [DataMember(EmitDefaultValue = false)] public IList<WorkOrder> WorkOrder { get; set; }

		public ExtensionDataObject ExtensionData { get; set; }

		//
		// Public Class Methods
		//

   		public override IList<KeyValuePair<string, object>> GetKeys()
    	{
			return new List<KeyValuePair<string, object>> 
			{ 
				new KeyValuePair<string, object>(PRODUCT_ID, ProductID)
			};
    	}

    	public PocoReference<Product> GetReference()
		{
			PocoReference<Product> reference = GetReference(ProductID);
			reference.PocoKey.ID = ObjectID;
			return reference; 
		}

		public static PocoReference<Product> GetReference(Int32 productID)
		{
			List<KeyValuePair<string, object>> pairs = new List<KeyValuePair<string, object>> 
			{ 
				new KeyValuePair<string, object>(PRODUCT_ID, productID)
			};

			return GetReference(new PocoKey { Name = PRODUCT, KeyValues = pairs });
		}		
    	
    	private static PocoReference<Product> GetReference(PocoKey pocoKey)
		{
			return new PocoReference<Product>
			{
				PocoKey = pocoKey
			};
		}

		//
		// Repository Calls
		//
		
		public override string EntitySetName()
    	{
			return Repository.EntitySetName<Product, EntityModel.Product>(false);
    	}

		public override IQueryable<PocoBase> Find()
    	{
			return Repository.Find<Product, EntityModel.Product>(SearchOptions, MergeOption.NoTracking).Cast<PocoBase>();
    	}

		public override PocoKey Add()
    	{
			PocoKey key = Repository.Add<Product, EntityModel.Product>(this);
			PocoReference<Product> reference = GetReference(key);
			
			ProductID = (Int32)key.KeyValues.FirstOrDefault(k=> k.Key.Equals(PRODUCT_ID)).Value;

			if (ProductDocument != null)
			{
				foreach (ProductDocument productDocument in ProductDocument)
				{
					if (productDocument.Product != null && productDocument.Product.ObjectID == ObjectID)
						productDocument.ProductReference = reference;
				}
			}
			
			if (ProductProductPhoto != null)
			{
				foreach (ProductProductPhoto productProductPhoto in ProductProductPhoto)
				{
					if (productProductPhoto.Product != null && productProductPhoto.Product.ObjectID == ObjectID)
						productProductPhoto.ProductReference = reference;
				}
			}
			
			if (PurchaseOrderDetail != null)
			{
				foreach (PurchaseOrderDetail purchaseOrderDetail in PurchaseOrderDetail)
				{
					if (purchaseOrderDetail.Product != null && purchaseOrderDetail.Product.ObjectID == ObjectID)
						purchaseOrderDetail.ProductReference = reference;
				}
			}
			
			if (WorkOrder != null)
			{
				foreach (WorkOrder workOrder in WorkOrder)
				{
					if (workOrder.Product != null && workOrder.Product.ObjectID == ObjectID)
						workOrder.ProductReference = reference;
				}
			}
			
			return key;
    	}
    	
		public override void Update()
    	{
			Repository.Update<Product, EntityModel.Product>(this);
    	}
    	
		public override void Delete()
		{
			Repository.Delete<Product, EntityModel.Product>(this);
	
			if (ProductDocument != null)
			{
				foreach (ProductDocument productDocument in ProductDocument)
				{
					if (productDocument.Product == this)
					{
						productDocument.Product = null;
						productDocument.ProductReference = null;
					}
				}
			}
	
			if (ProductProductPhoto != null)
			{
				foreach (ProductProductPhoto productProductPhoto in ProductProductPhoto)
				{
					if (productProductPhoto.Product == this)
					{
						productProductPhoto.Product = null;
						productProductPhoto.ProductReference = null;
					}
				}
			}
	
			if (PurchaseOrderDetail != null)
			{
				foreach (PurchaseOrderDetail purchaseOrderDetail in PurchaseOrderDetail)
				{
					if (purchaseOrderDetail.Product == this)
					{
						purchaseOrderDetail.Product = null;
						purchaseOrderDetail.ProductReference = null;
					}
				}
			}
	
			if (WorkOrder != null)
			{
				foreach (WorkOrder workOrder in WorkOrder)
				{
					if (workOrder.Product == this)
					{
						workOrder.Product = null;
						workOrder.ProductReference = null;
					}
				}
			}
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Webbert Solutions
United States United States
Dave is an independent consultant working in a variety of industries utilizing Microsoft .NET technologies.

Comments and Discussions