2011-03-04 15 views
9

Basit bir varlık çerçeve kodu ilk uygulaması oluşturmaya çalışıyorum. Yeni bir kullanıcı oluşturmak ve bir istisna ile çakışanVarlık Çerçeve Kodu nasıl alınır İlk ve geçersizleştirilebilen yabancı anahtar özellikleri çalışmak için?

INSERT deyimi almak veritabanına (bir ActivationTicket olmadan kullanıcı) kaydetmek çalıştığınızda

public class User 
{ 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    public virtual ActivationTicket ActivationTicket { get; set; } 
} 

public class ActivationTicket 
{ 
    public int ActivationTicketId { get; set; } 

    public virtual User User { get; set; } 

    public string Ticket { get; set; } 
} 

: Ben bu sınıflara sahip FOREIGN KEY kısıtlaması "ActivationTicket_User". Çakışma, veritabanı "Test", "dbo.ActivatioTickets", "ActivationTicketId" sütununda gerçekleşti. Açıklama feshedildi.

Ben EF sırasıyla 1-1 Kullanıcı ve ActivationTicket arasındaki eşleştirmeyi davranır varsayalım ama 1-0..1

Bu ne işe ben almak için ne gerekiyor olmalıdır?

 
modelBuilder 
    .Entity<User>() 
    .HasOptional<ActivationTicket>(u => u.ActivationTicket) 
    .WithOptionalPrincipal(); 

Bu null olan bir KullanıcıNo içeren bir ActivationTickets tablosunu verecektir:

cevap

20

Böyle bir eşleme kuralı gerekir.

+0

Sadece EF ile çalışmaya başladım, bu yüzden bu haritalama kuralının nereye yerleştirileceğinden emin değilim. Tüm bu eşlemelerin saklanacağı bir yer var mı? – b3n

+2

İki seçeneğiniz var. 1) Doğrudan DbContext'ten türetilen bir sınıfın yöntemine koyun: korumalı geçersiz kılma geçersiz OnModelCreating (ModelBuilder modelBuilder) - VEYA - 2) ModelBuilder.Configurations.Add (new ...) – anon

+1

'u kullanarak eşlemeleri tanımlayın. Eşlemleri ayrı sınıflarda tanımlamanızı öneririm (EntityTypeConfiguration öğesinden türetilen YourModelClass_MappingClass öğelerini tanımlayın ve bu sınıfın oluşturucusunda eşlemeyi tanımlayın, sonra @anon'ın kendi yorumunda yazdığı gibi DbContext OnModelCreating etkinliğinde başlatmanız gerekir. Ayrı sınıfları kullanmak çünkü tüm sınıflarınızın aynı yerde haritalandırılmasını tanımlamak gerçek bir karmaşa olurdu – Prokurors

4

b3n en az VS 2013 ile, bunu yapabilecek kadar olmalıdır @:

public class User 
{ 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    public int? ActivationTicketId { get; set;} 

    public virtual ActivationTicket ActivationTicket { get; set; } 
} 

Bu önemli bir parçasıdır: Bu "Kullanıcı ForeignKey belirleyecek

public int? ActivationTicketId { get; set;} 

"ActivasionTicket için tablo ve isteğe bağlı olduğunu tanımlayın. http://forums.asp.net/t/1948351.aspx?Change+Foreign+Key+to+nullable+using+Code+First#5554732

ben aynı problem vardı ve anında benim için çalıştı: için

kredisi gidin.

Ayrıca bir not olarak tüm ana anahtarlarımı "[Key]" veri eki ile işaretledim. Bu işi yapmak için gerekli olabilir.

İlgili konular