Jak mam odwzorować następującą relację w Entity Framework 5?Entity Framework 5 Code First Self-Referencing Relationship
public class Item {
public int Id { get; set; }
public int? ParentItemId { get; set; }
public string Value { get; set; }
public Item ParentItem { get; set; }
public List<Item> ChildItems { get; set; }
}
Próbowałem to:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Item>()
.HasOptional(i => i.ParentItem)
.WithMany(i => i.ChildItems)
.HasForeignKey(i => i.ParentItemId);
}
a to:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Item>()
.HasMany(i => i.ChildItems)
.WithOptional(i => i.ParentItem)
.HasForeignKey(i => i.ParentItemId);
}
oba wynik w ten błąd:
typów wszystkich właściwości w zależnych Rola ograniczenia referencyjnego musi być taka sama, jak odpowiednie typy właściwości w Pri ncipal Role.
Jeśli zacznę z mapowaniem bazy pierwszego, oto co wygenerowany podmiot wygląda następująco:
public partial class Item
{
public Item()
{
this.ChildItems = new HashSet<Item>();
}
public int Id { get; set; }
public Nullable<int> ParentItemId { get; set; }
public string Value { get; set; }
public virtual ICollection<Item> ChildItems { get; set; }
public virtual Item ParentItem { get; set; }
}
wiem, że to będzie działać, jeśli zacznę db-pierwszy, po prostu trzeba wiedzieć jak zdefiniuj relację w kodzie-pierwszym.
jest 'Id' własność klucz? A może masz mapowanie klawiszy (z Fluent API?) Na inną właściwość, na przykład na "Wartość"? – Slauma
Id jest podstawową właściwością klucza elementu. – user326502
"* typy wszystkich właściwości w roli zależnej *" oznaczają typy właściwości FK, która jest "ParentItemId" i ma typ 'int?'. "* odpowiednie typy właściwości w głównej roli *" oznaczają typy właściwości PK, która jest "Id" i ma typ 'int'. Są takie same (nieważne nie ma znaczenia). Jednak wyjątek mówi, że tak nie jest. Wyjątek wystąpiłby, gdybyś miał na przykład 'long' (lub dowolny inny typ) dla PK i' int? 'Dla FK. Raczej dziwne ... – Slauma