2012-06-04 10 views
9

Ben kompozit anahtar ile bir model var - satır anahtarı geçerli: The Date field is required.:Entity Framework: bileşik anahtarın alanı null olamaz?

var it = new Item { Date = null, UserId = 2 }; 
m_Entities.Items.Add(it); 
m_Entities.SaveChanges(); // throws exception 

(m_Entities olağandır DbContext soyundan o mesajla istisna DbEntityValidationException atar altında

public class Item 
{ 
    [Key, Column(Order = 0)] 
    public int UserId { get; set; } 
    [Key, Column(Order = 1)] 
    public DateTime? Date { get; set; } 
} 

kod çalıştırma DbSet<Item> olarak tanımlanan öğeler null (DateTime? olarak bildirilmiş) neden Date neden gereklidir? Ve null'un Date için geçerli bir değer olmasına nasıl izin verilir?

cevap

8

Raphael'in yanıtı başka bir aramaya yönlendirdi. > False

Wierd - NULL == NULL:

What's wrong with nullable columns in composite primary keys?

Kısacası: Bu (Cobsy gelen cevap) mümkün değildir nedeni işte budur. Benim için çözüm, Id sütunu Modele eklemektir.

BTW:. MySQL beni birincil anahtar tanımlamak için değil izin, sonra ben böyle şema hakkım var - EF hakkında önemli :-(tanımlayan değil şikayet

1

Bu mümkün değildir. Her RDBMS gereksinimi, birincil anahtarın null olmamalıdır.

+2

Peki, birincil anahtardır {UserId, Tarih} Sadece tarihin null olması garantilidir - bu yüzden neden mümkün değil? İfadenizi kabul etmeyin.Fakat, kodun mümkün olduğu yerde PHP/MySQL'in portudur. – Zoka

2

Sql Server veya birincil anahtarın herhangi bir kısmı için Oracle ile mümkün değildir.

Ancak bu veriler üzerinde benzersiz bir kısıtlama olabilir. Eğer bir kez

UserId = 2, Date = null 

olabileceği anlamına gelir

Sonra

UserId = 2, Date = <NOT NULL> 

Sen Kod Birinci ile doğrudan benzersiz kısıtlamaları oluşturmak ama SMO bakamıyor.