我剛剛從代碼優先的場景中講解自己的實體框架(6)。我的問題是我不明白如何正確地指示EF可以在其他實體之間共享某些實體。如何在代碼優先的情況下共享EF6對象
這是一個非常簡單的三層樹狀結構。類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
對象擁有5個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。我意識到我可以通過網絡挖掘並找出這一點,但如果任何人都可以指出我在正確的方向,我將非常感激。
乾杯
你所描述的B和C之間的多到5月聯想當你說多BS可以具有相同的C也說C可以有多個基站。所以C應該有一個Bs和EF的集合,它們將通過數據庫中的聯結表BC進行建模。 –
謝謝,格特。這使我確實走上了正確的軌道。請看我的下一個答案(我需要添加一些代碼)... –