Skip to main content
Notice removed Draw attention by Kirsten
Bounty Ended with Mattias Åslund's answer chosen by Kirsten
added 20 characters in body
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18

My test passes, but is my idea sound? [Update1] Here is a database diagram of the database I get. enter image description here The reason I have the [NotMapped] attribute is to prevent Entity Framework from creating the base tables. I want TPT not TPH

My test passes, but is my idea sound? [Update1] Here is a database diagram of the database I get. enter image description here The reason I have the [NotMapped] attribute is to prevent Entity Framework from creating the base tables.

My test passes, but is my idea sound? [Update1] Here is a database diagram of the database I get. enter image description here The reason I have the [NotMapped] attribute is to prevent Entity Framework from creating the base tables. I want TPT not TPH

added 316 characters in body
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18

My test passes, but is my idea sound? [Update1] Here is a database diagram of the database I get. enter image description here The reason I have the [NotMapped] attribute is to prevent Entity Framework from creating the base tables.

Thus the purpose of the base classes are for code re-use.

My test passes, but is my idea sound?

My test passes, but is my idea sound? [Update1] Here is a database diagram of the database I get. enter image description here The reason I have the [NotMapped] attribute is to prevent Entity Framework from creating the base tables.

Thus the purpose of the base classes are for code re-use.

i missed some details important to running the code.
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18
[TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestCreateSalesOrderFromQuote()
        {
            using (var ctx = new CrmDbContext())
            {
                var customer = new Customer {Name = "test"};     
                ctx.Customers.Add(customer);

                var quote = new SalesQuote {Customer = customer, CreatedOn = DateTime.Now};
                quote.Lines.Add(new SalesQuoteLine
                {
                    Description = "Box of widgets",
                    Price = (decimal) 100.50
                });
                ctx.SalesQuotes.Add(quote);

                var oc = ((IObjectContextAdapter) ctx).ObjectContext;
                var order = Functions.CloneSalesObject<SalesOrder, SalesOrderLine>(oc, quote) as SalesOrder;
                Assert.AreEqual(order.Customer.Id, quote.Customer.Id);
                Assert.AreEqual(order.Lines[0].Description, quote.Lines[0].Description);
            }
        }
    }
public static BaseSalesHeader CloneSalesObject<T1, T2>( ObjectContext oc, BaseSalesHeader baseSale) where T1 : BaseSalesHeader where T2 : BaseSalesLine
        {
            var obj = oc.CreateObject<T1>();
            obj.CreatedOn = DateTime.Now;
            obj.Customer = baseSale.Customer;

            foreach (var line in baseSale.CopyOfLines)
            {
                var newLine = oc.CreateObject<T2>();
                // clone properties needed from BaseSalesLine
                newLine.Price = line.Price;
                newLine.Description = line.Description;

                obj.AddLine(newLine);
            }
            return obj  ;
        }
public abstract class BaseSalesHeader : BasicBo
    {
        public DateTime CreatedOn { get; set; }
        public virtual Customer Customer { get; set; }
        public string CustomerReference { get; set; }
        [Notmapped]  // needed to avoid a BaseSalesHeader being created
        public abstract List<BaseSalesLine> CopyOfLines { get; }
        public abstract void AddLine(BaseSalesLine line);
    }
public abstract class BaseSalesLine : BasicBo
    {
        [NotMapped] // needed to avoid a BaseSalesLine table being created
        public abstract BaseSalesHeader SalesHeader { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
    }
public abstract class BasicBo
    {
        public virtual int Id { get; set; }
    }
public class Customer : BasicBo
    {
        public string Name { get; set; }
    }
public class SalesOrder : BaseSalesHeader  
    {
        public SalesOrder()
        {
            Lines = new List<SalesOrderLine>();
        }
        public virtual List<SalesOrderLine> Lines { get; set; }
         
        public override List<BaseSalesLine> CopyOfLines => Lines.Cast<BaseSalesLine>().ToList();
        public override void AddLine(BaseSalesLine line)
        {
            Lines.Add(line as SalesOrderLine);
        }
    }
public class SalesOrderLine : BaseSalesLine
    {
        public virtual SalesOrder SalesOrder { get; set; }

        public override BaseSalesHeader SalesHeader
        {
            get { return SalesOrder; }
            set { SalesOrder = (SalesOrder) value; }
        }
    }
public class SalesQuote : BaseSalesHeader 
    {
        public SalesQuote()
        {
            Lines = new List<SalesQuoteLine>();
        }

        public List<SalesQuoteLine> Lines { get; set; }
         
        public override List<BaseSalesLine> CopyOfLines => Lines.Cast<BaseSalesLine>().ToList();
        public override void AddLine(BaseSalesLine line)
        {
            Lines.Add(line as SalesQuoteLine);
        }
    }
public class SalesQuoteLine : BaseSalesLine
    {
        public virtual SalesQuote SalesQuote { get; set; }
        public override BaseSalesHeader SalesHeader
        {
            get { return SalesQuote; }
            set { SalesQuote = (SalesQuote)value; }
        }
    }
[TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestCreateSalesOrderFromQuote()
        {
            using (var ctx = new CrmDbContext())
            {
                var customer = new Customer {Name = "test"};     
                ctx.Customers.Add(customer);

                var quote = new SalesQuote {Customer = customer};
                quote.Lines.Add(new SalesQuoteLine
                {
                    Description = "Box of widgets",
                    Price = (decimal) 100.50
                });
                ctx.SalesQuotes.Add(quote);

                var oc = ((IObjectContextAdapter) ctx).ObjectContext;
                var order = Functions.CloneSalesObject<SalesOrder, SalesOrderLine>(oc, quote) as SalesOrder;
                Assert.AreEqual(order.Customer.Id, quote.Customer.Id);
                Assert.AreEqual(order.Lines[0].Description, quote.Lines[0].Description);
            }
        }
    }
public static BaseSalesHeader CloneSalesObject<T1, T2>( ObjectContext oc, BaseSalesHeader baseSale) where T1 : BaseSalesHeader where T2 : BaseSalesLine
        {
            var obj = oc.CreateObject<T1>();

            obj.Customer = baseSale.Customer;

            foreach (var line in baseSale.CopyOfLines)
            {
                var newLine = oc.CreateObject<T2>();
                // clone properties needed from BaseSalesLine
                newLine.Price = line.Price;
                newLine.Description = line.Description;

                obj.AddLine(newLine);
            }
            return obj  ;
        }
public abstract class BaseSalesHeader : BasicBo
    {
        public DateTime CreatedOn { get; set; }
        public virtual Customer Customer { get; set; }
        public string CustomerReference { get; set; }

        public abstract List<BaseSalesLine> CopyOfLines { get; }
        public abstract void AddLine(BaseSalesLine line);
    }
public abstract class BaseSalesLine : BasicBo
    {
        public abstract BaseSalesHeader SalesHeader { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
    }
public abstract class BasicBo
    {
        public virtual int Id { get; set; }
    }
public class Customer : BasicBo
    {
        public string Name { get; set; }
    }
public class SalesOrder : BaseSalesHeader  
    {
        public SalesOrder()
        {
            Lines = new List<SalesOrderLine>();
        }
        public virtual List<SalesOrderLine> Lines { get; set; }
         
        public override List<BaseSalesLine> CopyOfLines => Lines.Cast<BaseSalesLine>().ToList();
        public override void AddLine(BaseSalesLine line)
        {
            Lines.Add(line as SalesOrderLine);
        }
    }
public class SalesOrderLine : BaseSalesLine
    {
        public virtual SalesOrder SalesOrder { get; set; }

        public override BaseSalesHeader SalesHeader
        {
            get { return SalesOrder; }
            set { SalesOrder = (SalesOrder) value; }
        }
    }
public class SalesQuote : BaseSalesHeader 
    {
        public SalesQuote()
        {
            Lines = new List<SalesQuoteLine>();
        }

        public List<SalesQuoteLine> Lines { get; set; }
         
        public override List<BaseSalesLine> CopyOfLines => Lines.Cast<BaseSalesLine>().ToList();
        public override void AddLine(BaseSalesLine line)
        {
            Lines.Add(line as SalesQuoteLine);
        }
    }
public class SalesQuoteLine : BaseSalesLine
    {
        public virtual SalesQuote SalesQuote { get; set; }
        public override BaseSalesHeader SalesHeader
        {
            get { return SalesQuote; }
            set { SalesQuote = (SalesQuote)value; }
        }
    }
[TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestCreateSalesOrderFromQuote()
        {
            using (var ctx = new CrmDbContext())
            {
                var customer = new Customer {Name = "test"};     
                ctx.Customers.Add(customer);

                var quote = new SalesQuote {Customer = customer, CreatedOn = DateTime.Now};
                quote.Lines.Add(new SalesQuoteLine
                {
                    Description = "Box of widgets",
                    Price = (decimal) 100.50
                });
                ctx.SalesQuotes.Add(quote);

                var oc = ((IObjectContextAdapter) ctx).ObjectContext;
                var order = Functions.CloneSalesObject<SalesOrder, SalesOrderLine>(oc, quote) as SalesOrder;
                Assert.AreEqual(order.Customer.Id, quote.Customer.Id);
                Assert.AreEqual(order.Lines[0].Description, quote.Lines[0].Description);
            }
        }
    }
public static BaseSalesHeader CloneSalesObject<T1, T2>( ObjectContext oc, BaseSalesHeader baseSale) where T1 : BaseSalesHeader where T2 : BaseSalesLine
        {
            var obj = oc.CreateObject<T1>();
            obj.CreatedOn = DateTime.Now;
            obj.Customer = baseSale.Customer;

            foreach (var line in baseSale.CopyOfLines)
            {
                var newLine = oc.CreateObject<T2>();
                // clone properties needed from BaseSalesLine
                newLine.Price = line.Price;
                newLine.Description = line.Description;

                obj.AddLine(newLine);
            }
            return obj  ;
        }
public abstract class BaseSalesHeader : BasicBo
    {
        public DateTime CreatedOn { get; set; }
        public virtual Customer Customer { get; set; }
        public string CustomerReference { get; set; }
        [Notmapped]  // needed to avoid a BaseSalesHeader being created
        public abstract List<BaseSalesLine> CopyOfLines { get; }
        public abstract void AddLine(BaseSalesLine line);
    }
public abstract class BaseSalesLine : BasicBo
    {
        [NotMapped] // needed to avoid a BaseSalesLine table being created
        public abstract BaseSalesHeader SalesHeader { get; set; }
        public string Description { get; set; }
        public decimal Price { get; set; }
    }
public abstract class BasicBo
    {
        public virtual int Id { get; set; }
    }
public class Customer : BasicBo
    {
        public string Name { get; set; }
    }
public class SalesOrder : BaseSalesHeader  
    {
        public SalesOrder()
        {
            Lines = new List<SalesOrderLine>();
        }
        public virtual List<SalesOrderLine> Lines { get; set; }
         
        public override List<BaseSalesLine> CopyOfLines => Lines.Cast<BaseSalesLine>().ToList();
        public override void AddLine(BaseSalesLine line)
        {
            Lines.Add(line as SalesOrderLine);
        }
    }
public class SalesOrderLine : BaseSalesLine
    {
        public virtual SalesOrder SalesOrder { get; set; }

        public override BaseSalesHeader SalesHeader
        {
            get { return SalesOrder; }
            set { SalesOrder = (SalesOrder) value; }
        }
    }
public class SalesQuote : BaseSalesHeader 
    {
        public SalesQuote()
        {
            Lines = new List<SalesQuoteLine>();
        }

        public List<SalesQuoteLine> Lines { get; set; }
         
        public override List<BaseSalesLine> CopyOfLines => Lines.Cast<BaseSalesLine>().ToList();
        public override void AddLine(BaseSalesLine line)
        {
            Lines.Add(line as SalesQuoteLine);
        }
    }
public class SalesQuoteLine : BaseSalesLine
    {
        public virtual SalesQuote SalesQuote { get; set; }
        public override BaseSalesHeader SalesHeader
        {
            get { return SalesQuote; }
            set { SalesQuote = (SalesQuote)value; }
        }
    }
added 231 characters in body
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18
Loading
added 3753 characters in body
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18
Loading
added 3753 characters in body
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18
Loading
Tweeted twitter.com/StackCodeReview/status/724309677039849472
deleted 188 characters in body
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18
Loading
added 9 characters in body; edited title
Source Link
Jamal
  • 35.2k
  • 13
  • 134
  • 238
Loading
edited tags
Link
200_success
  • 145.7k
  • 22
  • 191
  • 481
Loading
Notice added Draw attention by Kirsten
Bounty Started worth 50 reputation by Kirsten
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18
Loading