Entity Framework один ко многим по умолчанию

Я пытаюсь установить связь «один ко многим» в Entity Framework, где один из многих элементов может быть выбран по умолчанию.

public class SomeEntity
{
    public int Id { get; set; }
    public Item DefaultItem { get; set; }          // Optional
    public ICollection<Item> Items { get; set; }
}

public class Item
{
    public int Id { get; set; }
    public string ItemName { get; set; }
    public SomeEntity SomeEntity { get; set; }
}

Конфигурация API-интерфейса «один-ко-многим» кажется довольно простой:

HasMany(e => e.Items).WithRequired(i => i.SomeEntity).WillCascadeOnDelete(true);

Но решение для реализации элемента по умолчанию оказалось труднодостижимым. Я пробовал это (и различные варианты), но безуспешно. Он сообщает мне, что «Указанная схема недействительна».

HasOptional(e => e.DefaultItem).WithRequired(i => i.SomeEntity);

Любые идеи? Заранее спасибо.


person RogerMKE    schedule 01.04.2013    source источник
comment
stackoverflow.com/questions/12458887/   -  person IamStalker    schedule 02.04.2013


Ответы (1)


Это немного нетипичная «установка» (и обычно она обозначается каким-то «флагом» на элементе - но я, возможно, вижу потребность в чем-то подобном) и дважды связывает один элемент с одним и тем же родителем.

Однако это должно сработать ...

modelBuilder.Entity<SomeEntity>()
    .HasOptional(x => x.DefaultItem)
    .WithOptionalPrincipal() // x => x.DefaultForEntity)
    .WillCascadeOnDelete(false);
...
// public SomeEntity DefaultForEntity { get; set; } // optional

... и используйте его так:

var item = new Item { ItemName = "Default1", };
db.SomeEntities.Add(new SomeEntity { DefaultItem = item, Items = new[]
{
    item,
    new Item{ ItemName = "Item1", },
    new Item{ ItemName = "Item2", },
    new Item{ ItemName = "Item3", },
    new Item{ ItemName = "Item4", },
}
});
db.SaveChanges();
person NSGaga-mostly-inactive    schedule 02.04.2013
comment
Это помогло. Огромное спасибо! Причина, по которой я не использовал флаг, заключается в том, что это позволило бы установить свои флаги для двух записей. Наличие единственного поля, содержащего идентификатор элемента по умолчанию, гарантирует, что в данных нет возможности каких-либо ошибок. - person RogerMKE; 02.04.2013