2015-03-26 2 views
0

Tout d'abord permettez-moi de m'excuser pour le titre pauvre, je ne suis pas tout à fait conscient de ce que j'appelle ce sujet.Code d'abord, plusieurs clés étrangères

.. Enfin bref

Je suis en train de créer une relation BankAccount<-->Transactions en utilisant le code premier.

Voici mes "classes d'entités"

public class BankAccount : BaseEntity 
{ 
    public string Name { get; set; } 
    public double Balance { get; set; } 

    public virtual long UserId { get; set; } 
    public virtual User User { get; set; } 

    public virtual ICollection<Transaction> FromTransactions { get; set; } 

    public virtual ICollection<Transaction> ToTransactions { get; set; } 
} 

et

public class Transaction : BaseEntity 
{ 
    public string Message { get; set; } 
    public double Amount { get; set; } 

    public virtual long ToId { get; set; } 
    public virtual BankAccount To { get; set; } 

    public virtual long FromId { get; set; } 
    public virtual BankAccount From { get; set; } 
} 

Comme vous pouvez le voir, je voudrais une transaction pour être en mesure d'avoir un "From" BankAccount et un "A" BankAccount pour faciliter la navigation d'une transaction vers le (s) compte (s) bancaire (s) associé (s). Le BankAccount a également deux collections de transactions, une "De" et une "À", et c'est aussi pour faciliter la navigation entre les objets.

La chose est que dès que je lance Update-Database il échoue avec:

modifications en conflit au rôle « BankAccount_ToTransactions_Source » de la relation « de OpenFridge.Api.Data.BankAccount_ToTransactions » ont été détectés

J'ai également ajouté les deux suivants EntityTypeConfigurations:

public class BankAccountEntityTypeConfiguration : BaseEntityTypeConfiguration<BankAccount> 
    { 
     public BankAccountEntityTypeConfiguration() 
     { 
      ToTable("BankAccounts"); 

      HasRequired(e => e.User) 
       .WithMany(e => e.BankAccounts); 

      Property(e => e.Balance) 
       .IsRequired(); 

      Property(e => e.Name) 
       .IsRequired(); 

      HasMany(e => e.ToTransactions) 
       .WithRequired(e => e.To).WillCascadeOnDelete(false); 

      HasMany(e => e.FromTransactions) 
       .WithRequired(e => e.From).WillCascadeOnDelete(false); 
     } 
    } 

public class TransactionEntityTypeConfiguration : BaseEntityTypeConfiguration<Transaction> 
    { 
     public TransactionEntityTypeConfiguration() 
     { 
      ToTable("Transactions"); 

      Property(e => e.Amount) 
       .IsRequired(); 

      HasRequired(e => e.From); 

      HasRequired(e => e.To); 
     } 
    } 

Toute idée de comment créer ce genre de relation de manière appropriée? Je pourrais simplement manquer quelque chose dans ma base de données de conception et ..

Br, Inx

Répondre

0

Pour ce que ça vaut la peine, une solution rapide pour la mise à jour base de données qui échoue (si vous êtes encore dans la conception phase) est de supprimer la base de données et exécuter à nouveau la base de données de mise à jour pour construire à partir de zéro. Parfois, les erreurs concernent la séquence d'événements lorsque vous modifiez votre modèle. Une autre vérification que vous pouvez faire est d'exécuter update-database -script et exécuter le SQL résultant dans la base de données manuellement. Le dernier correctif que je peux offrir est de supprimer la relation incriminée dans la base de données. Pour vous aider dans le futur, il peut être utile d'utiliser des annotations de données dans votre modèle. [Required] [Key] [ForeignKey("ForeignKeyId")] peut être utile pour spécifier comment tout se connecte et réduit le code dans vos configurations aux relations uniquement.

0

Vous devrez peut-être indiquer les noms de vos clés étrangères dans l'entité Transaction comme ceci:

public class Transaction : BaseEntity 
{ 
    public string Message { get; set; } 
    public double Amount { get; set; } 

    public virtual long ToId { get; set; } 
    [ForeignKey("ToId")] 
    public virtual BankAccount To { get; set; } 

    public virtual long FromId { get; set; } 
    [ForeignKey("FromId")] 
    public virtual BankAccount From { get; set; } 
}