8

ben db.SaveChanges(); talimatı aşağıdaki hatayı alıyorum:Neden bu bir NULL değer istisnası atıyor? Nedense

Cannot insert the value NULL into column 'UserId', table 'XXXXXXXXX_Dev.dbo.Portfolios'; column does not allow nulls. INSERT fails. 
The statement has been terminated. 

Kontrolör kodu:

[HttpPost] 
[Authorize] 
public ActionResult Create(Portfolio portfolio) 
{ 
    if (ModelState.IsValid) 
    { 
     portfolio.UserId = (Guid)Membership.GetUser().ProviderUserKey; 
     db.AddToPortfolios(portfolio); 
     db.SaveChanges(); 
    } 
    return View("MyPortfolios"); 
} 

Ben ayıklayıcıya adım attı ve kullanıcı kimliği doldurulur ediliyor doğruladı.

Güncelleme:

Ben db.Portfolios.AddObject(portfolio); için db.AddToPortfolios(portfolio); değiştirmeyi denedim ama hala aynı sorun var.

PortfoliosObjectSet, Attach() yöntemini kullanmalı mıyım?

+0

'UserId' yabancı bir anahtardır, başka bir tabloya veya 'Portföy' tablonuzdaki birincil anahtar mı (ya da her ikisi de 1- 1 arası ilişki için)? EF 4.1 kullanıyor musunuz? Merak ediyorum çünkü 'db' kodunuzda 'ObjectContext' ve' DbContext' değil. – Slauma

+0

Haklısınız sürüm 4 değil 4.1 kullanıyorum. Veritabanını oluşturmak için ilk yaklaşımı kullandım. 'UserId', 'Portföy' için birincil anahtardır. Portföyün başka bir tabloyla çok fazla ilişkisi vardır. Entity framework, gerçek veritabanında bir çok kişiye kolaylık sağlamak için birleştirme tablosu oluşturmuş gibi görünüyor. – ZeroDivide

cevap

8

Ben sadece bir durumdan bu istisnayı biliyoruz, yani: UserId veritabanınızda bir kimlik sütunu değil ama EF modelinde karşılık gelen mülkiyet gibi işaretlendiğinde - bu explicitely metotunun DatabaseGeneratedOption.Identity veya tarafından ilişkilendirilir ya anlamına gelir konvansiyonlar.

Sorun şu ki, EF bu durumda, DB değerini bir sütun değeri oluşturmak için yapacağı varsayımından dolayı, özellik değerini Db'ye göndermez (bu ayarlanmış olsun ya da olmasın). Ama Db, bu yüzden istisna değil.

Sadece bir tahmin.

Düzenleme:

Eğer DatabaseGeneratedOption.None ile bayrak UserId gerekir sorunu çözmek için.

+0

UserId, "DatabaseGeneratedOption.Intentity" olarak ayarlandı. Bunu başka bir şeye değiştirmeliyim mi? – ZeroDivide

+0

İlgili db sütunu 'UserId (PK, benzersiz tanımlayıcı, null değil)' – ZeroDivide

+0

@ZeroDivide: Evet, 'DatabaseGeneratedOption.None' çözümdür. 'Uniqueidentifier'/guid sütunları, SQL Server'da otomatik olarak oluşturulmaz. – Slauma