Entity Framework - Code First отношения: один к одному - PullRequest
1 голос
/ 21 августа 2011

У меня есть две таблицы: Пользователи и компании:

public class User
{
    // Properties
    public long Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Username { get; set; }

    public long AgencyId { get; set; }
    public Company Company { get; set; }

    // Custom Propreties
    [ScaffoldColumn(false)]
    public string FullName
    {
        get
        {
            return FirstName + " " + LastName;
        }
    }
}

public class Company
{
    public long Id { get; set; }

    public string Name { get; set; }

    public virtual ICollection<User> Users { get; set; }
}

Конфигурация такая же ...

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        this.HasKey(x => x.Id);

        this.Property(x => x.Id);
        this.Property(x => x.FirstName).IsRequired();
        this.Property(x => x.LastName).IsRequired();
        this.Property(x => x.Username).IsRequired();
        this.Property(x => x.CompanyId).IsRequired();

        this.HasRequired(user => user.Company).WithMany().HasForeignKey(user => user.CompanyId);
    }
}

public class CompanyConfiguration : EntityTypeConfiguration<Company>
{
    public CompanyConfiguration()
    {
        this.ToTable("Companies");

        this.HasKey(x => x.Id);

        this.Property(x => x.Id);
        this.Property(x => x.Name).IsRequired();

        this.HasMany(company => company.Users).WithRequired().HasForeignKey(user => user.CompanyId);
    }
}

Если я создаю представление с компаниями, чтобы показать каждую компанию и сделать один столбец «Количество пользователей в компании», то представление будет отображаться, как и ожидалось, с указанием количества пользователей в каждой компании. Тем не менее, когда я пытаюсь показать каждого пользователя в представлении и показать там Company.Name в столбце, то он говорит, что компания является нулевой. Может кто-нибудь объяснить, если мои пользовательские отношения между Пользователем и Компанией нарушаются?

************ РЕДАКТИРОВАТЬ *************** *

    public UserConfiguration()
    {
        this.HasKey(x => x.Id);

        this.Property(x => x.Id);
        this.Property(x => x.FirstName).IsRequired();
        this.Property(x => x.LastName).IsRequired();
        this.Property(x => x.Username).IsRequired();
        this.Property(x => x.CompanyId).IsRequired();

        this.HasRequired(user => user.Company).WithMany().HasForeignKey(user => user.CompanyId);
        this.HasMany(user => user.AdministratorApplications)
            .WithMany(application => application.Administrators)
            .Map(map =>
            {
                map.ToTable("ApplicationAdministrators");
                map.MapLeftKey("ApplicationId");
                map.MapRightKey("UserId");
            });
    }

    public ApplicationConfiguration()
    {
        this.HasKey(x => x.Id);

        this.Property(x => x.Name).IsRequired();
        this.Property(x => x.Accronym).IsRequired();
        this.Property(x => x.Description);

        this.HasMany(application => application.Administrators)
            .WithMany(user => user.AdministratorApplications)
            .Map(map =>
            {
                map.ToTable("ApplicationAdministrators");
                map.MapLeftKey("UserId");
                map.MapRightKey("ApplicationId");
            });
    }

    public ApplicationAdministratorConfiguration()
    {
        this.ToTable("ApplicationAdministrators");

        this.HasKey(x => x.Id);

        this.Property(x => x.Id);
        this.Property(x => x.ApplicationId).IsRequired();
        this.Property(x => x.UserId).IsRequired();

        this.HasRequired(appAdmin => appAdmin.Application).WithMany().HasForeignKey(appAdmin => appAdmin.ApplicationId);
        this.HasRequired(appAdmin => appAdmin.User).WithMany().HasForeignKey(appAdmin => appAdmin.UserId);
    }

Вот класс ApplicationAdministrator

public class ApplicationAdministrator
{
    [Column("Id")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [HiddenInput]
    public long Id { get; set; }

    [Display(Name = "Application")]
    public long ApplicationId { get; set; }
    public virtual Application Application { get; set; }

    [Display(Name = "Administrator")]
    public long UserId { get; set; }
    public virtual User User { get; set; }
}

И, наконец, ошибка

Указанная схема недействительна. Ошибки: (144,6): ошибка 0019: EntitySet 'UserApplication' со схемой 'dbo' и таблицей ApplicationAdministrators уже определены. Каждый EntitySet должен обратитесь к уникальной схеме и таблице.

Строка 15: публичные пользователи IQueryable Строка 16: { Строка 17: get {return context.Users.Include ("Администраторские приложения"). Include ("Компания"); } Строка 18:} Строка 19:

1 Ответ

3 голосов
/ 21 августа 2011

Вам нужно сделать Company свойство virtual

public class User
{
    // Properties

    public virtual Company Company { get; set; }

}

Если вы не хотите делать это virtual, вам нужно указать EF загрузить Company свойство, используя Includemethod.

Сделав свойство virtual EF будет лениво загружать свойство.Но если вы обращаетесь к свойству Company при доступе к объекту user, то вы можете использовать метод Include для загрузки свойства Company.

var users = context.Users.Include(user => user.Company).Where(/*conditions*/);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...