Use enum as FK in EF6

c# entity-framework entity-framework-6


We have a enum Supplier

But now we need to also have some Domain data on that relation

So in 99.9% in the domain code we doe operations on the enum like product.Supplier == Suppliers.FedEx

But now we also have added product.SupplierInfo.CanAdjustPickupTime where SupplierInfo is a Entity and not just a simple enum type.

I have tried these configs

Property(p => p.Supplier)

HasRequired(p => p.SupplierInfo)
    .HasForeignKey(p => p.Supplier); //I have also tried casting to int doing .HasForeignKey(p => (int)p.Supplier)

This will fail with

The ResultType of the specified expression is not compatible with the required type. The expression ResultType is 'MyApp.Model.Suppliers' but the required type is 'Edm.Int32'. Parameter name: keyValues[0]

Also tried

Property(l => l.Supplier)

HasRequired(p => p.SupplierInfo)
    .Map(m => m.MapKey("SupplierId"));

This will offcourse give the good old

One or more validation errors were detected during model generation:

SupplierId: Name: Each property name in a type must be unique. Property name 'SupplierId' is already defined.

I could offcourse define SupplierId as a Property use that with HasForeignKey But then I need to change to .SuppliedId == (int)Suppliers.FedEx etc. Not really a solution.

I could also add a property enum that uses the SupplierId property as backing field, but this will not work with Expressions since it needs to use real mapped DB properties

Any ideas?

9/30/2015 8:22:51 AM

Popular Answer

The best way I have found to deal with this scenario is to map Supplier as a regular domain object and create a separate class of known supplier IDs.

public class KnownSupplierIds
    public const int FedEx = 1;
    public const int UPS = 2;
    // etc.

if (product.Supplier.SupplierId == KnownSupplierIds.Fedex) { ... };

When your code needs to check the supplier, it can compare the IDs; when you need additional info from the domain model you just load the Supplier. The reason I prefer using a class of constants instead of an enum is that the pattern works for string comparisons also and there's no need to cast.

4/23/2017 6:03:51 PM

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow