2015-02-04 2 views
0

Так у меня есть следующая модель в EF:EF6 Code First многие-ко-многим без коллекций

public class User: IEntity 
{ 
    public Guid Id { get; protected set; } 
    public string Email { get; protected set; } 
    internal User() 
    { 
    } 

    public User(Guid id, string email) 
    { 
     Id = id; 
     Email = email; 
    } 
} 

public class Tenant : IEntity 
{ 
    public Guid Id { get; protected set; } 
    public string Name { get; protected set; } 

    internal Tenant() { } 

    public Tenant(Guid id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 
} 

Я хотел бы иметь многие-ко-многим между этими структурами, не имея коллекции в них.

Я попытался создать присоединиться объект как:

public class TenantUser 
{ 
    public int Id { get; set; } 
    public virtual Tenant Tenant { get; set; } 
    public virtual User User { get; set; } 

    internal TenantUser() 
    { 
    } 

    public TenantUser(Tenant tenant, User user) 
    { 
     this.Tenant = tenant; 
     this.User = user; 
    } 
} 

С следующей установкой:

modelBuilder.Entity<TenantUser>() 
    .HasRequired<Tenant>(m => m.Tenant) 
    .WithMany(); 

modelBuilder.Entity<TenantUser>() 
    .HasRequired<User>(m => m.User) 
    .WithMany(); 

Когда я сохранить объекты TenantUser, база данных заполняется с правильными внешними ключами. Когда я запрашиваю DbSet TenantUser для всех строк, он возвращает все строки, но я получаю только заполненное значение Id, Tenant и User равны нулю.

Я попытался добавить поля TenantId и UserId в TenantUser, а затем сделать HasForeignKey для этих полей, но это не имело никакого значения; TenantId и UserId были заполнены по запросу, но Tenant и User по-прежнему были нулевыми.

Я чувствую, что мне не хватает чего-то простого здесь. Любые мысли было бы здорово :)

+0

Im немного не уверены, что отношения вы пытаетесь создать здесь? Можете ли вы описать отношения, которые вы используете в словах, или, возможно, если их более простой пост DB-диаграммы отношений. –

+0

Проблема, вероятно, заключается в том, что вы не включаете «Пользователь» и «Арендатор» при запросе таблицы (а не в самой конфигурации). Я не уверен, что это можно настроить, но попробуйте выполнить запрос с помощью 'ctx.TenantUsers.Include (tu => tu.Tenant) .Include (tu => tu.User)'. – Alxandr

+0

Это довольно неясно. Что вы хотите, чтобы многие из многих не имели коллекций? Каким другим способом можно ссылаться на объект, который имеет отношение ко многим другим элементам, чем к другим элементам в какой-либо коллекции? – Claies

ответ

5

Если вы хотите много-ко-многим затем удалить конфигурацию:

modelBuilder.Entity<TenantUser>() 
.HasRequired<Tenant>(m => m.Tenant) 
.WithMany(); 

modelBuilder.Entity<TenantUser>() 
.HasRequired<User>(m => m.User) 
.WithMany(); 

Почему? Поскольку соглашения об использовании EF:

public class User: IEntity 
{ 
    public Guid Id { get; protected set; } 
} 

public class Tenant : IEntity 
{ 
    public Guid Id { get; protected set; } 
} 

public class TenantUser 
{ 
    public int Id { get; set; } 
    public virtual Tenant Tenant { get; set; } 
    public virtual User User { get; set; } 
} 

Это бегло много-ко-многим.

При выполнении запроса, используйте:

public class UnitOfWork : DbContext 
{ 
    public IDbSet<User> Users { get; set; } 
    public IDbSet<Tenant> Tenants { get; set; } 
    public IDbSet<TenantUser> TenantUsers { get; set; } 
} 

context.TenantUsers.Include(e => e.Tenant).Include(e => e.User); 

Тогда EF Включить их в отображении

+0

Похоже, что работает, спасибо. Быстрый вопрос. Я не вижу метод Include, который принимает лямбда-выражение, я вижу только Include, который принимает строку. Если я включаю («Арендатор»). Включает («Пользователь»), он работает. Это то, что вы имели в виду, или есть метод расширения, который позволит мне использовать выражение вместо этого? (желательно) – Gerald

+0

Ничего, я нашел его в 'System.Data.Entity'. Благодаря! – Gerald

Смежные вопросы