Сначала определите внешний ключ 2 в модели кода EntityFrameWork MVC - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть телефонная книга с таблицей общего доступа и таблицей участников. В общей таблице должно быть 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.Members.Single(m => m.Shares.Any(sh => sh.Id == item.Id))

или этот:

db.Shares.Single(sh => sh.Id == item.Id).JointMember

но они оба возвращают Нуль.

Я пробую больше версий моделей, таких как: одна ICollection в Member или одна опора Member в Share Model, но ни одна из них не дает мне настоящих таблиц БД и ответа. Кроме того, мне нужно, по крайней мере, одну коллекцию общих ресурсов в модели участников для получения элемента общих ресурсов по элементам, как вы знаете, я закодировал EFCodeFirst, и мне нужен способ решения этой проблемы, спасибо

1 Ответ

1 голос
/ 14 ноября 2011

Вам необходимо определить отношения в OnModelCreating событии вашего DbContext следующим образом:

    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

...