2016-06-03 2 views
0

Я хотел бы добавить объект к связанному объекту без их загрузки. У меня есть сущность компании, определенную как это:Entity Framework добавить объект к связанному объекту без загрузки

public class Company 
{ 
    public int ID { get; set; } 
    public List<Employee> EmployeeList{ get; set; }  

} 

И сущность Employee как этот

public class Employee 
{ 
    public int ID { get; set; } 
    public String Name{ get; set; }  
} 

Я хочу, чтобы добавить сотрудник в список помещенного в этом объекте компании без загрузки всех сотрудников.

Я знаю, что могу использовать это выражение Company myCompany= systemBD.Companies.Include("EmployeeList").Find(1) myCompany.EmployeeList.Add(newEmployee) , но я боюсь, что это потребует много времени с тех пор, как у меня есть тысячи сотрудников в моей базе данных.

Есть ли способ добавить нового сотрудника в существующую компанию без загрузки списка сотрудников? Я искал метод Attach, но, похоже, он не работает.

 using (var systemDB = new CompanyDB()) 
     { 
      Employee employee = new Employee();     
      Company companySearch = systemDB.Companies.Where(d => d.Name.Equals("John")).SingleOrDefault(); 
      if (companySearch != null) 
      { 
       if (companySearch.EmployeeList != null) 
       { 
        systemDB.Companies.Attach(companySearch); 
        companySearch.EmployeeList.Add(employee); 
        systemDB.SaveChanges(); 

       } 

      } 

Я пробовал этот код, но он не работает.

+2

Что такое переменная 'deviceSearch', поскольку она не определена в любом месте кода, который вы предоставили. Не должно быть 'companySearch.EmployeeList.Add (сотрудник);'? –

+0

, пожалуйста, используйте первый или первый подход к базе данных базы данных? – suulisin

+0

Я предполагаю, что это код-первый из-за примера, который он опубликовал – Rafa

ответ

3

Если у вас есть ваши лица компании и сотрудников определены иметь как свойство навигации от компании к сбору всех связанных с ним сотрудников и имущества от Сотрудник своей единственной ассоциированной компании, вы можете создать нового сотрудника и связать его с существующей компанией из набора БД сотрудников.

[Table("Company")] 
public partial class Company 
{ 
    public Company() 
    { 
     this.Employees = new HashSet<Employee>(); 
    } 

    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    public virtual ICollection<Employee> Employees { get; set; } 
} 

[Table("Employee")] 
public partial class Employee 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    public int CompanyId { get; set; } 

    public virtual Company Company { get; set; } 
} 

public partial class Database : DbContext 
{ 
    public Database() 
     : base("name=Database") 
    { 
    } 

    public virtual DbSet<Company> Companies { get; set; } 
    public virtual DbSet<Employee> Employees { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Company>() 
      .Property(e => e.Name) 
      .IsUnicode(false); 

     modelBuilder.Entity<Company>() 
      .HasMany(e => e.Employees) 
      .WithRequired(e => e.Company) 
      .WillCascadeOnDelete(false); 

     modelBuilder.Entity<Employee>() 
      .Property(e => e.Name) 
      .IsUnicode(false); 
    } 
} 

Тогда предполагается, что вы уже есть компания в системе с идентификатором 1, вы можете сделать следующее:

using (var database = new Database()) 
{ 
    var company = database.Companies.Find(1); 
    if (company != null) 
    { 
     var employee = new Employee 
     { 
      Name = "John Doe", 
      Company = company 
     }; 

     database.Employees.Add(employee); 
     database.SaveChanges(); 
    } 
} 

ИЛИ ... если вы уверены, что компания Id 1 определенно существует ...

using (var database = new Database()) 
{ 
    var employee = new Employee 
    { 
     Name = "John Doe", 
     CompanyId = 1 
    }; 

    database.Employees.Add(employee); 
    database.SaveChanges(); 
} 
-2

Я думаю, вам нужно будет изменить дизайн базы данных, чтобы выполнить то, что вы хотите.

Employee table 
    ID (Primary key) 
    Name 
Company table 
    ID (Primary key) 
    Name 
EmployeeCompany table 
    IDCompany (Foreign Key) 
    IDEmployee (ForeignKey) 

Таким образом, вы будете выполнять то, что вы хотите

+2

Как может ассоциация «многие-ко-многим» магически решить эту проблему? Это не только технические изменения, но и логические, о которых OP никогда не просил. Кроме того, вы не показываете код C#, чтобы справиться с этим изменением. –

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