我刚刚开始从代码优先的场景中自学实体框架 (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。我确实意识到我可以通过网络来解决这个问题,但如果有人能指出我正确的方向,我将非常感激。
干杯