Use enum as FK in EF6

c# entity-framework entity-framework-6

Question

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)
    .IsRequired()
    .HasColumnName("SupplierId");

HasRequired(p => p.SupplierInfo)
    .WithMany()
    .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)
    .IsRequired()
    .HasColumnName("SupplierId");

HasRequired(p => p.SupplierInfo)
    .WithMany()
    .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?

1
4
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.

0
4/23/2017 6:03:51 PM


Related Questions





Related

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