web-dev-qa-db-fra.com

Problèmes de création d'une relation de clé étrangère sur Entity Framework

j'ai du mal à configurer une relation de clé étrangère dans mon Api couramment Entity Framework:

Voici la tête du rapport:

 public class Testata
{
    public Testata() { Details = new List<Dettaglio>(); }
    public virtual int IDTEST { get; set; }
    public virtual string Value { get; set; }
    public virtual int IDDETAIL { get; set; }
    public virtual string IDTESTALT { get; set; }
    public virtual byte[] BLOB { get; set; }

    public virtual IList<Dettaglio> Details { get; set; }
}

Ceci est le détail du rapport

public class Dettaglio
{
    public virtual int IDDETAIL { get; set; }
    public virtual int IDTEST { get; set; }
    public virtual string DSDETAIL { get; set; }

    public virtual Testata TEST_TABLE { get; set; }
}

Et voici ma définition courante de l'API des deux. Responsable du rapport:

public TEST_TABLEMap()
    {
        // Primary Key
        this.HasKey(t => t.IDTEST)
            .Property(t => t.IDTEST)
            .IsRequired()
            .HasColumnType("Int")
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
            .HasColumnName("IDTEST");


        // Table & Column Mappings
        this.ToTable("TEST_TABLE");
        this.Property(t => t.Value).HasColumnName("DSVALUETEST");
        this.Property(t => t.IDTESTALT).HasColumnName("IDTESTALT");
        this.Property(t => t.BLOB).HasColumnName("BLOB");
    }

Détail du rapport:

public TEST_DETAILMap()
    {
        // Primary Key
        this.HasKey(t => t.DSDETAIL);

        // Properties
        this.Property(t => t.DSDETAIL);

        // Table & Column Mappings
        this.ToTable("TEST_DETAIL");
        this.Property(t => t.IDDETAIL).HasColumnName("IDDETAIL");
        // this.Property(t => t.IDTEST).HasColumnName("IDTEST");
        this.Property(t => t.DSDETAIL).HasColumnName("DSDETAIL");

        // Relationships
        this.HasOptional(t => t.TEST_TABLE)
            .WithMany(t => t.Details)
            .HasForeignKey(d => d.IDDETAIL).WillCascadeOnDelete(true);

    }

À l'exécution, j'obtiens toujours cette erreur

System.Data.Entity.Edm.EdmAssociationType:: la multiplicité entre en conflit avec la contrainte référentielle dans le rôle 'Dettaglio_TEST_TABLE_Target' dans la relation 'Dettaglio_TEST_TABLE'. Étant donné que toutes les propriétés du rôle dépendant ne peuvent pas être annulées, la multiplicité du rôle principal doit être "1".

Ce qui, je suppose, signifie que j'échoue quelque chose à la définition de la clé étrangère, mais je ne sais pas vraiment où regarder. Toute aide/indice est très apprécié.

39
user2541621

Il existe un conflit entre votre propriété de clé étrangère dans la classe Dettaglio...

public virtual int IDTEST { get; set; }

... qui a un type non nullable (int) et ne peut donc pas être optionnel et votre mappage ...

this.HasOptional(t => t.TEST_TABLE) //...

... où vous souhaitez que la relation soit facultative.

Si vous voulez en effet une relation facultative, utilisez une propriété FK nullable:

public virtual int? IDTEST { get; set; }

Sinon, vous devez utiliser HasRequired pour une relation requise avec une propriété FK non nullable.

106
Slauma