0

я строю свое хранилище для использования с EntityFramework .one проблем я столкнулся в том, как обрабатывать метод InsertOrUpdate в случае подобного:Как реализовать InsertOrUpdate метод для детального объекта

Если у меня есть метод интерфейса:

void InsertOrUpdate(T entity); 

реализация этого метода отлично работает с главной таблицей, как что:

public void InsertOrUpdate(Employee employee) 
{ 
    if (employee.EMP_NUM == default(int)) // New entity 
    { 
     context.Entry(employee).State = EntityState.Added; 
    } 
    else  // Existing entity 
    { 
     context.Employees.Add(employee); 
     context.Entry(employee).State = EntityState.Modified; 
    } 
} 

Теперь, если работник имеет много нот, как это:

EMP_NUM  p.k 
From_Date p.k 
Note 

Как обрабатывать один и тот же метод для этого объекта с составным ключом:

public void InsertOrUpdate(EmployeeNote employeeNote) 
{ 
    if (employeeNote.EMP_NUM == default(int)) // New entity 
    { 

     context.Entry(employeeNote).State = EntityState.Added; 
    } 
    else  // Existing entity 
    { 
     context.EmployeeNotes.Add(employeeNote); 
     context.Entry(employeeNote).State = EntityState.Modified; 
    } 
} 
+1

Я никогда не использую составные клавиши. Каждый объект наследует базовый класс с целым Id. Но если вы хотите использовать составные ключи, здесь есть статья, которая может помочь ... http: //blog.oneunicorn.com/2012/05/03/the-key-to-addorupdate/ – Colin

+0

@Colin: Не могли бы вы уточнить ваше решение с примером пожалуйста –

ответ

1

Я думаю, что с помощью struct было бы самым простым решением:

public struct EmployeeKey 
{ 
    public int k; 
    public DateTime d; 
} 

if (new EmployeeKey{k = employeeNote.EMP_NUM, d = employeeNote.From_Date} 
      .Equals(default(EmployeeKey)) 
{ 
    context.Entry(employeeNote).State = EntityState.Added; 
} 

default(struct) создает struct со значениями по умолчанию всех его членов.

На небольшой: заметка на полях

Эта линия: context.Employees.Add(employee); для существующего объекта, она не должна быть context.Employees.Attach(employee);?