2015-10-02 20 views
15

tek yön:Varlık Çerçeve 6 opsiyonel İki tablo var ilişki

Client 
------------------------ 
Id   (string) <-- PrimaryKey 
Name   (string) 
Number  (int) 

Department:* 
------------------------ 
Id   (int) <-- Primary key 
Name   (string) 
ClientNumber (int?) 
Client  (Client, virtual) 
..... 

Şimdi (ClientNumber kullanarak) Müşteriye Bölümü'nden isteğe bağlı bir ilişki oluşturmak istiyorum. Bölüm sınıfında (İstemci) sanal bir özellik oluşturdum ve şimdi EntityTypeConfiguration kullanarak ilişkiyi yapılandırmam gerekiyor.

Veritabanı içinde yapılandırılmış yabancı anahtar yok veritabanında yapılandırılmış ve ben veritabanını değiştiremiyorum. Varlık (sınıf) İstemcisini de değiştiremiyorum.

Bu nedenle EntityFramework'a, İstemci sınıfındaki ClientNumber öğesinin, İstemci sınıfındaki Number özelliğine (isteğe bağlı olarak) ilişkin olduğunu bildirmem gerekir.

Ama Bölümü ClientNumber Müşterinin Numara mülk değil, Müşterinin birincil anahtar ile ilgilidir EF anlatmak anlamaya olamaz. (İstemci varlık sınıfını değiştirmeden)

düzenleme: İstemcide Numara özelliği, her giriş için benzersizdir.

ilişki böyle bir sql deyimi yol açmalıdır

:

SELECT ..... 
FROM Department D LEFT OUTER JOIN Client C ON (D.ClientNumber = C.Number) 

Bu Linq katılır kullanarak yapmak kolaydır, ama sadece iyi olurdu:

dbContext.Departments.Include(d => d.Client) 

sanal kullanılarak İstemci (varsa) içeren bir sınıf sınıfı özelliği

+1

birincil anahtar sütunlarını kullanmadan varlık çerçevesinde ilişkilerini oluşturmak için hala da mümkün değildir. Bu ilişkiyi gerçekleştirmek istiyorsanız, istemci Kimliği sütununu yabancı anahtar sütunu olarak eklemeniz gerekir. Eğer bir şekilde istenmediyse, bu ilişkiyi modellemek için bir görünüm yaratabilirsiniz. –

cevap

0

Maalesef bu mümkün değil. EF'de valide ilişkin ilişki, veritabanında da geçerli olmalıdır; diğer bir deyişle, bağımlı tablo, ana tabloda benzersiz bir tanımlayıcıya başvurmalıdır. Aksi halde sistem, departman başına en fazla bir müşterinin bulunmadığından emin olamaz.

+2

Tamamen doğru değil. İlişki, EF * 'in * birincil anahtarı olarak bildiği bir mülkiyete atıfta bulunmalıdır. Client.Number' olabilir, ancak bu özellik modelde birincil anahtar olarak tanımlanmalıdır. EF 7 alternatif anahtarları destekleyecektir. –

0

, bir clientid ve ClientNumber özelliği hem eklemek mümkün olurdu? O Client olduktan sonra sanal İstemci özelliğinden erişim ClientNumber daha boş değil edebilirsiniz:

public class Client 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 
     public int Number { get; set; } 
    } 

    public class Department 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string ClientId { get; set; } 

     public virtual Client Client { get; set; } 

     [NotMapped] 
     public int? ClientNumber { 
      get { 
       return Client != null ? Client.Number : null; 
      } 
     } 
    } 
İlgili konular