2015-10-06 4 views
0

У меня есть модель с несколькими объектами. Например, у меня есть order, которые имеют CustomerId для внешнего ключа. В модели у меня есть поля из order и некоторые поля из объекта customer. Когда я сохраняю новую запись, я хотел бы сначала сохранить customer, получить новое значение идентификации и поместить его в таблицу order. Как это сделать? Я могу сделать это, получив MAX(ID) из таблицы customer, однако я уверен, что есть лучший способ справиться с этим.Как получить только что сгенерированный идентификатор в модели MVC

Это мой метод контроллера:

public ActionResult Create(OrderModels model, FormCollection form) 
{ 
    try 
    { 
     Customer customer = new Customer() { FirstName = model.FirstName, MiddleName = model.MiddleName, SecondName = model.SecondName, Email = model.Email, PhoneNbr = model.PhoneNbr }; 
     int orderSource = Int32.Parse(form["OrderSourceList"]); 
     int paymentType = Int32.Parse(form["PaymentTypeList"]); 
     string warehouseGuid = form["Warehouses"]; 
     ProductLogic productLogic = new ProductLogic(); 
     Product product = productLogic.GetProductByArticle(model.Article); 
     DateTime now = DateTime.Now; 

     SalesOrder salesOrder = new SalesOrder() 
     { 
      OrderNbr = model.OrderNbr, 
      OrderSourceId = orderSource, 
      NpWarehouseRef = new Guid(warehouseGuid), 
      TTN = model.TTN, 
      OrderStatusId = 1, 
      PaymentTypeId = paymentType, 
      OrderDate = DateTime.Now 
     }; 
     using (AccountingRepository repository = new AccountingRepository()) 
     { 

      repository.AddOrUpdate<Customer>(customer); 
      repository.AddOrUpdate<SalesOrder>(salesOrder); 
     } 
     return RedirectToAction("Index"); 
    } 
    catch (Exception e) 
    { 
     return View(); 
    } 
} 

AccountingRepository имеет dispose метод

public void Dispose() 
{ 
    if (_context != null) 
    { 
     _context.SaveChanges(); 
     _context.Dispose(); 
    } 
} 

Мой Order класс:

с использованием системы; с использованием System.ComponentModel.DataAnnotations; с использованием System.Collections.Generic; с использованием System.ComponentModel.DataAnnotations.Schema; с использованием System.Data.Entity.ModelConfiguration;

namespace Accounting.Entity 
{ 
    [Table("SalesOrder", Schema = "dbo")] 
    public class SalesOrder 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int? Id { get; set; } 

... 
     public int? CustomerId { get; set; } 

... 
     public virtual Customer Customer { get; set; } 

     internal class Config : EntityTypeConfiguration<SalesOrder> 
     { 
      public Config() 
      { 

       HasRequired(r => r.Customer) 
        .WithMany(r => r.SalesOrder) 
        .HasForeignKey(r => r.CustomerId); 



      } 
     } 
    } 
} 

Мой Customer класс:

using System.ComponentModel.DataAnnotations; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity.ModelConfiguration; 

namespace Accounting.Entity 
{ 
    [Table("Customer", Schema = "dbo")] 
    public class Customer 
    { 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int? Id { get; set; } 

     public string FirstName { get; set; } 

     public string MiddleName { get; set; } 

     public string SecondName { get; set; } 

     public string PhoneNbr { get; set; } 

     public string Email { get; set; } 


     public virtual HashSet<SalesOrder> SalesOrder { get; set; } 

     internal class Config : EntityTypeConfiguration<Customer> 
     { 
      public Config() 
      { 

      } 
     } 
    } 
} 
+2

Если вы используете EF, он будет заботиться о нем для вас, если у вас есть навигационные свойства на вашей модели. –

+0

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

+0

Я изменил вопрос и добавил классы контроллера и сущности. –

ответ

3

Два способа:

  1. Сохранить объект клиента и Entity Framework будет обратно заполнить свойство PK с его ID. Затем вы можете использовать это для объекта заказа.

    db.Customers.Add(customer); 
    db.SaveChanges(); 
    order.CustomerId = customer.Id; // has a value now 
    
  2. Просто свяжите клиента с заказом через навигационное свойство. Когда вы сохраняете все Entity Framework, какие из них необходимо сначала сохранить, а затем заполнить соответствующие идентификаторы FK в связанных объектах.

    order.Customer = customer; 
    db.Orders.Add(order); 
    db.SaveChanges(); // customer is saved first and the id is set for order.CustomerId automatically 
    
+0

Не могли бы вы показать пример? Я попытался сделать: AccountingRepository repository = new AccountingRepository(); репозиторий.AddOrUpdate (клиент); репозиторий.Save(); репозиторий.AddOrUpdate (salesOrder); репозиторий.Save(); repository.Dispose(); // и это не помогло –

+0

См. обновление выше. Если это не работает с вашими методами репозитория, то в репозитории ничего не настроено. –

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