2016-06-03 7 views
0

관련 엔터티에 개체를로드하지 않고 추가하고 싶습니다. I는 다음과 같이 정의 된 회사 법인이 : 나는 모든 직원을로드하지 않고 그 회사 객체에 배치 목록에 직원을 추가 할이Entity Framework에서로드하지 않고 관련 엔터티에 개체 추가

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

같은

public class Company 
{ 
    public int ID { get; set; } 
    public List<Employee> EmployeeList{ 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 (employee);가 아니어야합니까? –

+0

데이터베이스를 먼저 사용하거나 첫 번째 접근 방식을 사용하고 있습니까? – suulisin

+0

그가 게시 한 예제 때문에 코드 우선이라고 생각합니다 – Rafa

답변

3

원하는 것을 달성 할 것 직원을 하나의 연관된 회사에 연결하면 새로운 직원을 생성하고이를 Employees DB 세트의 기존 회사와 연관시킬 수 있습니다. 당신이 회사 ID 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(); 
    } 
} 

OR ... :

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

그런 다음 당신이 다음을 수행 할 수 있습니다, 당신은 이미 하나의 ID로 시스템에 회사를 가정 ...

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

어떻게 many-to-many 연관이 마술처럼이 문제를 해결할 수 있습니까? 이는 기술적 인 변화 일뿐만 아니라 OP가 결코 요구하지 않은 논리적 인 변화이기도합니다. 또한이 변경 사항을 처리하기 위해 C# 코드를 표시하지 않습니다. –

관련 문제