Vous devez prolonger votre Friend
classe:
public class Friend
{
[Key, Column(Order = 0), ForeignKey("Contact1")]
public int ContactId1 { get; set; }
public Contact Contact1 { get; set; }
[Key, Column(Order = 1), ForeignKey("Contact2")]
public int ContactId2 { get; set; }
public Contact Contact2 { get; set; }
public DateTime DateCreated { get; set; }
}
Et ajouter un attribut à la collection Friends
dans Contact
:
[InverseProperty("Contact1")]
public ICollection<Friend> Friends { get; set; }
(Vous pouvez également utiliser l'API Fluent au lieu des annotations
Le résultat est deux one-to-many relations (vous ne pouvez pas mapper ce modèle entre plusieurs-à-plusieurs). Le premier est compris entre Contact.Friends
et Friend.Contact1
et le second a Friend.Contact2
en tant que point d'extrémité. Le point d'extrémité dans Friend
n'est pas exposé dans le modèle.
Vous pouvez ensuite interroger par exemple pour tous les contacts d'ami d'un contact donné créé avant aujourd'hui:
DateTime today = DateTime.Now.Date;
IEnumerable<Contact> friendContacts = context.Contacts
.Where(c => c.ContactId == givenId)
.Select(c => c.Friends
.Where(f => f.DateCreated < today)
.Select(f => f.Contact2))
.SingleOrDefault();
Eit
Le mappage ne fonctionne pas au-dessus parce Friend
a deux relations nécessaires à Contact
. Par défaut, pour les relations un-à-plusieurs requises, EF active la suppression en cascade qui n'est pas autorisée pour deux relations en même temps. Nous avons besoin de réécrire la mise en correspondance avec l'API Fluent pour désactiver suppression en cascade, car cela est impossible avec annotations de données:
public class Contact
{
public int ContactID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public ICollection<Friend> Friends { get; set; }
}
public class Friend
{
public int ContactID1 { get; set; }
public Contact Contact1 { get; set; }
public int ContactID2 { get; set; }
public Contact Contact2 { get; set; }
public DateTime DateCreated { get; set; }
}
redéfinissent Puis OnModelCreating
dans votre contexte dérivé:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Friend>()
.HasKey(f => new { f.ContactID1, f.ContactID2 });
modelBuilder.Entity<Friend>()
.HasRequired(f => f.Contact1)
.WithMany(c => c.Friends)
.HasForeignKey(f => f.ContactID1);
modelBuilder.Entity<Friend>()
.HasRequired(f => f.Contact2)
.WithMany()
.HasForeignKey(f => f.ContactID2)
.WillCascadeOnDelete(false); // <- Important
}
double possible de [Many-to -Beaucoup de relation dans Code-First EF4] (http://stackoverflow.com/questions/3148844/many-to-many-relationship-in-code-first-ef4) – StriplingWarrior