One of the tricks I’ve used for a while when setting EF up in a project, is to use inheritance in order to share code, but not objects, across the business and data layers of the application.
Let’s take the following example, as shown above:
namespace MyProject.Models { public class ResourceModel {
And now the data layer:
namespace MyProject.Data.Resources { public class ResourceEntity : ResourceModel
This gives us a number of advantages: the code is shared between the objects, but the two objects are not the same. However, until recently, this presented an issue. Imagine that we had a property in the model that looked like this:
public TagModel[] Tags { get; }
TagModel itself might have a similar inheritance structure; however, how would you return that from the data layer – since the inheritance would force it to return the same type.
Covariance return type
Fortunately, since C# 9 you can return covariants (Covariance is basically the idea that you can substitute a sub-type for a class).
What this means is that you can override the relevant property in the sub class (the data layer). First, you’ll need to make the property virtual:
public class ResourceModel { public virtual TagModel[] Tags { get; } }
And then just override it:
public class ResourceEntity : ResourceModel { public int Id { get; set; } public override TagEntity[] Tags { get; } }
You can’t use anything like a List here, because (for example) a List of TagEntity has no relationship to a List of TagModel.
Hope this helps.