首先在MVC实体FrameWork Code模型中定义2个外键

时间:2011-11-14 11:40:21

标签: asp.net-mvc entity-framework ef-code-first

我有一个带有共享表和成员表的电话簿共享表必须有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编写的,我需要一种方法来解决这个问题,谢谢

1 个答案:

答案 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