2015-02-16 1 views
1

Я использую Ef6 Code First (Generic Repository Concepts)Общий способ реализации Ef6 Code First

Пример кода для создания записи:

Generic.cs:

public T Create<T>(T t) where T : class 
    { 
     T newEntry = this.dbContext.Set<T>().Add(t); 
     this.SaveChanges(); 
     return newEntry; 
    } 

Фактический код:

var customer = new Customer{ 
         Name = "Adams", 
         Amount = 1000 
        }; 

CustomerId is AutoIdentity Column Он автоматически генерирует идентификатор.

стол

Клиент, имеющий один-ко-многим с Продуктами (CustomerID FK в таблице Products)

Теперь я добавляю новых КодКлиента в Список продуктов

var productsList = new List<Product> 
{ 
    new Product 
     { 
      ProdName = "crocin", 
      Date = DateTime.Parse("2003-09-01"), 
      Customer.CustomerId = newCustomerId // 
     }, 
    new Product 
     { 
      ProdName = "crocin1", 
      Date = DateTime.Parse("2003-09-01"), 
      Customer.CustomerId = newCustomerId // 
     }, 
    new Product 
     { 
      ProdName = "crocin2", 
      Date = DateTime.Parse("2003-09-01"), 
      Customer.CustomerId = newCustomerId // 
     } 
}; 

Теперь я ударяя базы данных в два раза потому что сначала я получаю CustomerId, тогда я назначаю New CustomerId всем выбранным продуктам.

Вот код:

var newCustomer = Generic.Create<Customer>(customer); 

Итерируя список продуктов, и я assinging в newCustomerId в продукты ..

foreach(var product in productList) 
{ 
    product.CustomerId = newCustomerId; 

    Generic.Create<Product>(product); 
} 

Можно ли изменить этот код, чтобы более универсальный способ внедрения такого рода.

Create(T parentTable, List<T> childTableList) 
{ 
    // First Inserting ParentTable 

    db.SaveChanges(); 

    //Fetching ID 

    // Inserting Into ChildTables.. 

    db.SaveChanges(); 
} 

Просьба предложить мне расширить эту треску e ...

ответ

0

Проблема в том, что вам не нужна ассоциация Customer -> Products. Попробуйте добавить ссылку на Products из вашего Customer класса:

public class Customer 
{ 
    public Customer() 
    { 
     this.Products = new List<Product>(); 
    } 

    // your key 
    public int CustomerId { get; set; } 

    public string Name { get; set; } 
    public int Amount { get; set; } 

    // ... rest of your data 

    // the new association 
    public virtual ICollection<Product> Products { get; set; } 
} 

Теперь вы можете добавить их как в одном вызове:

var productsList = new List<Product> 
{ 
    new Product 
     { 
      ProdName = "crocin", 
      Date = DateTime.Parse("2003-09-01"), 
      Customer.CustomerId = newCustomerId // 
     }, 
    new Product 
     { 
      ProdName = "crocin1", 
      Date = DateTime.Parse("2003-09-01"), 
      Customer.CustomerId = newCustomerId // 
     }, 
    new Product 
     { 
      ProdName = "crocin2", 
      Date = DateTime.Parse("2003-09-01"), 
      Customer.CustomerId = newCustomerId // 
     } 
}; 

var newCustomer = new Customer(); 

foreach (var product in productsList) 
    newCustomer.Products.Add(product); 

Затем добавить их в контексте:

var newCustomer = Generic.Create<Customer>(newCustomer); 
+0

Спасибо haim770, чтобы ответить .. Мой код работает нормально .. но я хочу, чтобы все было в одном методе .. вроде this..Create (T parentTable, List childTableList) { // Вставка родительского стола db.SaveChanges(); // Извлечение ID // Вставка Into ChildTables. db.SaveChanges(); } возможно ли это? более общий способ реализации. – jsiklie

+0

Рефакторинг репозитория так, как вы предлагаете, поражает неосновную цель репозитория, поскольку он специально связан с потребностями «Заказчика». Вам нужно лучше понять, какова роль Object-Relational-Mapper (ORM). Он позволяет работать с «объектами», а не с «таблицами», и (судя по проблеме, которую вы представляете) ваш «Клиент» должен определенно содержать ссылку на соответствующую коллекцию «Продукт». – haim770

+0

Я постараюсь реализовать это ... – jsiklie