Я только начинаю изучать Entity Framework (6) из сценария «сначала код». Моя проблема в том, что я не понимаю, как правильно указать EF, что некоторые объекты могут быть разделены между другими объектами.
Вот очень простой сценарий с трехуровневой древовидной структурой. Объекты класса A
владеют объектами класса B
, которые владеют или ссылаются на объекты класса C
:
public class A
{
[Key]
public string Id { get; set; }
public ICollection<B> Bees { get; set; }
public override string ToString() { return Id; }
}
public class B
{
[Key]
public string Id { get; set; }
public ICollection<C> Cees { get; set; }
public override string ToString() { return Id; }
}
public class C
{
[Key]
public string Id { get; set; }
public override string ToString() { return Id; }
}
Теперь я создаю сценарий, в котором один объект A
владеет пятью объектами B
, которые, в свою очередь, разделяют набор из пяти объектов C
. Вот DbContext, который я использовал:
public class Context : DbContext
{
public DbSet<A> As { get; set; }
public DbSet<C> Cs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// SHOULD I INSTRUCT EF HOW TO HANDLE THIS HERE?
base.OnModelCreating(modelBuilder);
}
public Context(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
}
А вот простой код для настройки этого сценария:
internal class Program
{
private static void Main(string[] args)
{
var context = new Context(@"Data Source=(localdb)\v11.0; Initial Catalog=TestEF6.Collections; Integrated Security=true");
var sharedCees = createCees("A1.B1", 5, context);
context.As.Add(new A { Id = "A1", Bees = createBees("A1", 5, sharedCees) });
context.SaveChanges();
}
private static ICollection<B> createBees(string aId, int count, ICollection<C> cees = null)
{
var list = new List<B>();
for (var i = 0; i < count; i++)
{
var id = aId + ".B" + (i + 1);
list.Add(new B { Id = id, Cees = cees ?? createCees(id, count) });
}
return list;
}
private static ICollection<C> createCees(string bId, int count, Context saveInContext = null)
{
var list = new List<C>();
for (var i = 0; i < count; i++)
{
var id = bId + ".C" + (i+1);
var c = new C {Id = id};
list.Add(c);
if (saveInContext != null)
saveInContext.Cs.Add(c);
}
if (saveInContext != null)
saveInContext.SaveChanges();
return list;
}
}
Поскольку EF создает базу данных ("TestEF6.SharedEntities"), он предполагает, что A -> B
, а также B -> C
являются отношениями "один ко многим" и что дочерние сущности являются компонентами, полностью принадлежащими и контролируемыми его главной сущностью.
Итак, как заставить EF «видеть», что экземпляры C
могут совместно использоваться экземплярами B
?
Честно говоря, я прошу быстро начать работу с EF. Я понимаю, что могу порыться в Интернете и понять это, но если кто-нибудь может указать мне правильное направление, я был бы очень признателен.
Ваше здоровье