5
votes

I need to load a reqired:many relationship from database. Now my problem is, that the the key of the related table consists of three keys:

public partial class EnumValue
{
    [Key]
    [Column(Order = 0)]
    [StringLength(14)]
    public string EnumGroup { get; set; }

    [Key]
    [Column(Order = 1)]
    public byte EnumId { get; set; }

    [Key]
    [Column(Order = 2)]
    [StringLength(3)]
    public string Language { get; set; }

    [StringLength(50)]
    public string Description { get; set; }

}

In my other object I have only one property to fill the foreign key, the other parts are constants specific for this object.
I tried to build the relations in EF6, but can't get it to work with model builder and the Fluent API using constants instead of properties:

modelBuilder.Entity<SupplierCondition>()                
    .HasRequired(t => t.ConditionTypeLookupRef)
    .WithMany()
    .HasForeignKey(t => new { "PArt", t.ConditionType, "EN" });

How can I pass constants as a value for a foreign key in Fluent API?

2
If those constants are always the same so the primary key is just ConditionType property. - CodeNotFound
for 'SupplierCondition' it's always the same, for another table it's different. - Obl Tobl
What are you using for the structure of the anonymous type in your HasForeignKey() call? I'm trying to use that construct to specify the foreign key's name, as discussed here. - InteXX

2 Answers

1
votes

You can't use there const values because there isn't assign any value, you inform fluent API, which property refers to another table, when you pass "text", or 2, or new List(), it won't work they aren't properties, i think you can divide it to three tables, and use it as tags. But I can't see the bigger picture.

0
votes

One way to do this is to use a discriminator:

abstract class Condition {
  int condType;
  int condVal;
}
class PartCondition : Condtion {}

and in your context:

builder.Entity<Condition>(e => {
  // ...
  e.HasDiscriminator(e => e.condType)
    .HasValue<Condition>("")
    .HasValue<PartCondition>("Part")
});

I don't think this will let you use a composite (multi-column) discriminator, though.