2013-03-06 5 views
0

Мне нужно создать новый объект и добавить его в DB. Сначала я устанавливаю уникальный идентификатор продукта (мой объект). И верните представление, где пользователь может установить другие поля.MVC Entity framework говорит, что поле NULL, но это не

 public ViewResult Create() 
    { 
     var product = new Product { ProductID = GetFreeId() };  
     return View("Edit",product); 
    } 

Вид:

@using (Html.BeginForm()) { 
@Html.EditorForModel() 
<input type="submit" value="Save" />} 

Затем через контроллер мы пришли к этому методу:

public void AddProduct(Product product) 
{ 
    context.Products.Add(product); 
    context.SaveChanges(); 
} 

Если я поставил точку останова на последнем методе я буду видеть product.ProductID=10 но на string context.SaveChanges(); i исключение:

не может вставить объект с ProductID = null.

Где ошибка?

+0

просто интересно, что вы возвращаетесь к AddProduct actionresult? – ssilas777

+0

Да. [HttpPost] public ActionResult Создать (продукт продукта) { if (ModelState.IsValid) { { репозиторий.AddProduct (продукт); – Stalli

ответ

2

Если вы хотите поставить ключи вручную, и ключ не является автоматически генерируемой личность в базе данных вы должны сказать, что это Entity Framework, например, с помощью аннотаций данных в вашей Product модели:

public class Product 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ProductID { get; set; } 

    //... 
} 

С свободный API это:

modelBuilder.Entity<Product>() 
    .Property(p => p.ProductID) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

по умолчанию для int ключей является то, что EF предполагает, что идентификатор генерируется в базе данных и EF не будет посылать значение идентификатора в БД, даже если он установлен в вашей модели , База данных генерирует исключение, потому что она не получает ключа в инструкции INSERT.

+0

Спасибо u! Какой тип я должен установить для ProductID вместо int, чтобы избежать этой проблемы? – Stalli

+0

@Stalli: для 'string' и' Guid', я считаю, 'DatabaseGeneratedOption' является' None' по умолчанию. Но я оставил бы это 'int' и просто переопределить значение по умолчанию, как показано выше. Существует опция переопределить значение по умолчанию, нет ничего плохого в использовании этой опции. – Slauma

0

Вероятно, когда вы опубликуете сообщение, идентификатор не установлен. Вы должны установить его в методе post.

+0

Это не помогает. – Stalli