我有一个带有共享表和成员表的电话簿共享表必须有2个FK到成员表一个作为所有者而另一个作为联合成员但我无法真正建模:
这是我的数据库模型:
public class PhoneBookDB : DbContext {
public DbSet<Member> Members { get; set; }
public DbSet<ContactKind> ContactKinds { get; set; }
public DbSet<Contact> Contacts { get; set; }
public DbSet<NumberKind> NumberKinds { get; set; }
public DbSet<Number> Numbers { get; set; }
public DbSet<AddressKind> AddressKinds { get; set; }
public DbSet<Address> Addresses { get; set; }
public DbSet<City> Cities { get; set; }
public DbSet<Group> Groups { get; set; }
public DbSet<ShareAccess> ShareAccesses { get; set; }
public DbSet<Share> Shares { get; set; }
}
这是分享模式:
public class Share {
public long Id { get; set; }
public Group Group { get; set; }
public ShareAccess ShareAccess { get; set; }
public Member Owner { get; set; }
public Member JointMember { get; set; }
}
这是会员模型:
public class Member {
public long Id { get; set; }
public string UserName { get; set; }
public virtual ICollection<Group> Groups { get; set; }
public virtual ICollection<Share> OwnerShares { get; set; }
public virtual ICollection<Share> JointShares { get; set; }
public virtual ICollection<NumberKind> NumberKinds { get; set; }
public virtual ICollection<AddressKind> AddressKinds { get; set; }
}
使用这种模型设计我在共享表中有4个FK到DB的成员表,而且我也无法通过成员模型共享元素
像这样:
db.Members.Single(m => m.Shares.Any(sh => sh.Id == item.Id))
或者这个:
db.Shares.Single(sh => sh.Id == item.Id).JointMember
但他们都返回Null。
我尝试更多版本的模型,例如:成员中的一个ICollection或共享模型中的一个成员道具,但它们都没有给我一个真正的数据库表和答案。 另外,我需要至少一个成员模型中的共享集合,用于按成员检索共享元素,因为您知道我是通过EFCodeFirst编写的,我需要一种方法来解决这个问题,谢谢
答案 0 :(得分:1)
你需要在DbContext的OnModelCreating
事件中定义他的关系,就像这样,
modelBuilder.Entity<Share>().
HasRequired(s=>s.Owner ).WithMany(p=>p.OwnerShares).WillCascadeOnDelete(false);
modelBuilder.Entity<Share>().HasRequired(s=>s.JointMember )
.WithMany(p=>p.JointShares );
我认为您也可能需要定义其他关系(ShareAccess,Group)。这是一个很好的教程,开始, http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx