2013-10-11 13 views
7

Bu konuyla ilgili bir kaç soru var, ama sorum gerçek kendilik referanslama için çok spesifik. Diğer sorular için tüm örnekler döngüsel referanslardır ve bu durumda bana yardımcı olmuyor.Kodda gerçek kendini referanslayan varlıklar ile nasıl çalışılır EF5?

public class User 
{ 
    [Key] 
    public int Id { get; set; } 

    ... 

    public int CreatedByUserId { get; set; } 
} 

ve bu harita:

ben bu modeli var Diyelim göçler sonrasında

public class UserMap : EntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     this.HasRequired(a => a.CreatedByUser) 
      .WithMany() 
      .HasForeignKey(u => u.CreatedByUserId); 
    } 
} 

el kimliğine sahip SQL Management Studio'da bir kullanıcı ekleyebilir Bu kodu içeren bir veritabanı oluşturur = 1 ve CreatedByUserId = 1, böylece bana bu gibi özkaynakların çalışabileceğini söyler. Bir kullanıcı oluşturmak için EF kullanırken, "bağımlı işlemler için geçerli bir sıralamayı belirleyemem" sorunuyla karşılaşıyorum. İlk varlıkla ilgili yabancı bir anahtarı olan yeni bir varlığa atıfta bulunan yeni bir öğeyi içeren, konuyla ilgili bir çok soru var. Bu gibi durumlarda çözüm, ya ilk önce var olan varlıklardan birini kurtarır ya da dairesel varlık yabancı anahtarında geçersiz bir kimlik bulundurur. Bunlardan hiçbirini yapamam çünkü ilk imkansız olurdu ve ikincisi ise nemli ilanlara sahip olamayacağım harici bir kısıtlama.

El ile bir giriş ekleyerek bunu nasıl başarabileceğimi görmek, bunun bir EF5 sınırlaması olduğunu varsayabiliriz. İş çevreleri nelerdir?

+1

Public int? CreatedByUserId' kabul edilebilir mi? –

+0

* Harici kısıtlamanıza * ışık tutabilir misiniz? Bu da mantıken imkansız. Tavuk ya da yumurta ... 'OluşturulduYükletici' nüklüz olmalıdır. İlk kullanıcıyı oluşturmak için kullanıcı bulunamaz. – Khan

+0

@Scott, nullable int bir yok. – Levitikon

cevap

1

Hala arayüzünü tatmin ve ilk kaydet sonra CreatedByUserId için null destekçisi olarak hareket etmek başka özellik ekleyerek yöntemini ayarlayın yapabilirsiniz:

public class User : ICreatable 
{ 
    [Key] 
    public int Id { get; set; } 

    ... 

    public int CreatedByUserId 
    { 
     get 
     { 
      if (!_CreatedByUserId.HasValue) 
       //throw new exception, something went wrong. 

      return _CreatedByUserId; 
     }  
     set 
     { 
      _CreatedByUserId = value; 
     } 
    } 

    int? _CreatedByUserId { get; set; } 
} 
1

Bir kullanıcı olasılığını yeniden gözden geçirmek isteyebilirsiniz onu ya da kendini yaratabilir ...

Eğer gerçekten bunu yapmak istiyorsanız, o zaman bir çözüm var. Ana probleminiz, sütunun bir IDENTITY sütunu olması, yani EF'nin kimliği belirtmediği, SQL sunucusunun her satıra otomatik arttırma kimliği vermesidir. Kimlik olarak ayarladığınız herhangi bir değer göz ardı edilir. INSERT'i çalıştırırken, bir sonraki No'nun ne olacağı konusunda bilgi sahibi olmanıza gerek yoktur, bu nedenle henüz olmayan bir satıra bir referans oluşturamazsınız.

aşağıdaki gibi bir şey için haritalama kodunu değiştirin

: Sen adı deseni (. Örn CreatedByUser ve CreatedByUserId) eşleşirse yabancı anahtar belirtmek gerekmez

this.Property(x => x.Id) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

this.HasRequired(x => x.CreatedByUser) 
    .WithMany(); 

.

Artık bir Kullanıcı eklediğinizde, Id ve CreatedById değerini belirtebilirsiniz. Artık, her zaman yeni bir Kullanıcı eklemek için Kimliği belirtmeniz gerektiğini unutmayın. GUID'leri Ids olarak kullanıyorsanız, yeni bir nesne oluşturmadan önce bir sonraki "kullanılabilir" kimliği için ilk sorgulama yapmadan yeni bir GUID oluşturabileceğiniz için bu yaygın bir uygulamadır.

İlgili konular