2016-06-03 6 views
0

Ich möchte ein Objekt zu einer verbundenen Entität hinzufügen, ohne sie zu laden. I Unternehmen Einheit haben wie folgt definiert:Entity Framework Objekt zu verknüpfter Entität ohne Laden hinzufügen

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

} 

und Mitarbeiter-Unternehmen wie dieses

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

ich einen Mitarbeiter zu einer Liste in diesem Unternehmen Objekt platziert hinzufügen möchten alle Mitarbeiter ohne Beladung.

Ich weiß, dass ich diesen Ausdruck Company myCompany= systemBD.Companies.Include("EmployeeList").Find(1) myCompany.EmployeeList.Add(newEmployee) verwenden kann, aber ich habe Angst, dass dies eine Menge Zeit verbrauchen würde, da ich Tausende von Mitarbeitern in meiner Datenbank habe.

Gibt es eine Möglichkeit, einen neuen Mitarbeiter zu einer bestehenden Firma hinzuzufügen, ohne die Liste der Mitarbeiter zu laden? Ich habe die Attach-Methode untersucht, aber es scheint nicht zu funktionieren.

 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(); 

       } 

      } 

Ich habe diesen Code versucht, aber es funktioniert nicht.

+2

Was ist die Variable 'deviceSearch', da sie nirgendwo im von Ihnen bereitgestellten Code definiert ist? Sollte es nicht 'companiesSearch.EmployeeList.Add (employee); '? –

+0

Bitte benutzen Sie zuerst die Datenbank oder den ersten Code? – suulisin

+0

Ich denke, das ist Code-zuerst wegen des Beispiels, das er – Rafa

Antwort

3

Vorausgesetzt, dass Sie für Ihre Firma und Mitarbeiter Entitäten definiert haben beide eine Navigationseigenschaft haben, von einem Unternehmen spezialisiert auf die Sammlung aller seiner zugehörigen Mitarbeiter und eine Eigenschaft aus Wenn Sie einen Mitarbeiter für ein einzelnes verbundenes Unternehmen verwenden, können Sie einen neuen Mitarbeiter erstellen und mit einem vorhandenen Unternehmen aus dem Mitarbeiter-DB-Satz verknüpfen.

[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); 
    } 
} 

Dann vorausgesetzt, Sie bereits ein Unternehmen in dem System mit einer Id von 1 haben, können Sie folgendes tun:

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(); 
    } 
} 

ODER ..., wenn Sie sicher sind, dass Unternehmen Id 1 auf jeden Fall vorhanden ...

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

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

Ich denke, Sie müssten Ihren Datenbankentwurf ändern, um zu erreichen, was Sie wollen.

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

diese Weise werden Sie erreichen, was Sie wollen

+2

Wie kann eine Viele-zu-Viele-Vereinigung dieses Problem auf magische Weise lösen? Das ist nicht nur eine technische Veränderung, sondern auch eine logische, die das OP nie verlangt hat. Außerdem zeigen Sie den C# -Code nicht an, um mit dieser Änderung umzugehen. –