5

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?

Obl Tobl
  • 5,474
  • 7
  • 37
  • 62
  • If those constants are always the same so the primary key is just ConditionType property. – CodeNotFound Jun 07 '18 at 12:12
  • for 'SupplierCondition' it's always the same, for another table it's different. – Obl Tobl Jun 07 '18 at 12:22
  • 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](https://stackoverflow.com/q/59363602). – InteXX Dec 16 '19 at 20:30

2 Answers2

1

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.

Kacper
  • 412
  • 6
  • 16
  • 1
    thanks for your answer. I can't divide the tables, it's a big system where also other applications have access. So no changes are possible to the database. I think I have to find some other solution... – Obl Tobl Jun 07 '18 at 13:40
  • @OblTobl have you found any solutions to this? I've got the very same issue here and I'm starting to get a bit frustrated.. – krpec Mar 19 '19 at 11:00
  • @krpec No, unfortunately not. I now used a workaround and removed the according entites from modelbuilder and wrote methods in the according controller where I can build the joins manually. – Obl Tobl Mar 19 '19 at 11:04
  • @OblTobl Ok, so basically what I've got in store if there's no solution. Thanks for the reply! – krpec Mar 19 '19 at 11:20
  • @OblTobl Ugh my exact problem. I can't find where the foreign key table is being hit though. A breakpoint in its controller never gets hit so setting the logic in the controller isn't an option for me right now. – Newbie12345 Apr 23 '19 at 19:30
0

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.

matt
  • 45
  • 9