Вы не хватает фактических полей FK ItemID
и RelativeItemID
:
и настроить свойство навигации вы можете использовать атрибут InverseProperty
, наряду с отключением немного EF конвенции (как показано ниже).
public class ItemRelation
{
public long ID { get; set; }
public long ItemID { get; set; } // Missing
[ForeignKey("ItemID")]
[InverseProperty("ItemRelations")]
public virtual Item Item { get; set; }
public long RelativeItemID { get; set; } // Missing
[ForeignKey("RelativeItemID")]
[InverseProperty("RelativeItemRelations")]
public virtual Item RelativeItem { get; set; }
[Required]
public ItemRelationType Type { get; set; }
}
Декларация выше использует virtual
так, что ленивые погрузочные работы. Это не обязательно, и вы можете удалить его. Следствием этого является то, что ленивая загрузка не будет работать, и это тоже нормально.
Предполагая, что вы хотите, свойство навигации для второго соотношения необходимо добавить свойство:
public class Item
{
...
public virtual ICollection<ItemRelation> RelativeItemRelations { get; set; }
...
}
А затем отключить каскадное удаление конвенции путем переопределения OnModelCreating
, если вы уже не имеете, в вашем контексте класса следующим образом:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
...
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
...
Это решение должно работать, но это эффективно отключить каскадное удаление для всех один ко многим отношений. Положительным моментом является то, что вы можете вернуть его в каждом конкретном случае, используя беглый api.
Второй способ добиться того, что вы хотите, чтобы просто использовать свободно API следующим образом:
Добавить второе свойство навигации к вашему Item
объекта:
public class Item
{
...
public virtual ICollection<ItemRelation> RelativeItemRelations { get; set; }
...
}
ItemRelation
объект отсутствует в FKs, так что вот оно:
общественный класс ItemRelation { public long ID {get; задавать; }
public long ItemID { get; set; } // Missing
public virtual Item Item { get; set; }
public long RelativeItemID { get; set; } // Missing
public virtual Item RelativeItem { get; set; }
[Required]
public ItemRelationType Type { get; set; }
}
и настроить свойство навигации, и избежать проблем каскадных, вы просто определить отношения с использованием свободно API:
public TheContext : DbContext
{
public DbSet<Item> Items { get; set; }
public DbSet<ItemRelation> ItemRelations { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ItemRelation>()
.HasRequired(e => e.Item)
.WithMany(t => t.ItemRelations)
.HasForeignKey(e => e.ItemID)
.WillCascadeOnDelete(false);
modelBuilder.Entity<ItemRelation>()
.HasRequired(e => e.RelatedItem)
.WithMany(t => t.RelativeItemRelations)
.HasForeignKey(e => e.RelativeItemID)
.WillCascadeOnDelete(false);
// Uncomment the following if you want to disable all cascading deletes and automatic fk creation conventions
// modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();
// modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
// modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
...
}
}
Read here for an opinion on why you might consider disabling those conventions.
"некоторый язык словарь модели", "некоторые отношение "," некоторая ошибка "," один случай - другой случай "- все это довольно расплывчато. –