SOLID principles for kids.
Class must have only one reason to change and only one responsibility.
Entites must not modify database, it's repository's job, do not make Swiss Army knife class
Code must be open for extension and closed for modification.
Consider discount class, if you use switch/case or if/else in order to handle different types of discounts, you violated this principle, because in order to handle new type of discount, you have to add new case/else to the class. you can use interfaces, e.g: IDiscount and add Calculate method to it, then add a class for each type of discounts, in order to handle new type of discount, you just need to add new class for it and there is no need to touch other discount classes.
Derived classes must be substitutable for their base classes.
A Square is a Rectangle, so inheriting form Rectangle class to make a Square makes sense, right? okay, can you use Square anywhere you expect a Rectangle? See: this Stackoverflow answer
Clients should not be forced to depend upon interfaces that they don't use.
Consider you have an interface called IFile with 2 methods, Read and Write, and now you want to add a class just for reading file, e.g: FileReader, if you use IFile interface for this class, you have to implement Write method too, and that's the problem.
High level modules should not depend on low level modules, both should depend on abstractions. Abstractions should not depend on details, details should depend upon abstractions.
High level classes should not work directly with low level classes, they should work with them through interfaces. for example in ASP.NET MVC, ProductController should not work directly with ProductRepository, it should work with IProductRepository