2016-04-05 36 views
0

Ben şu sınıfları:bire-bir akıcı ayarını eklemek olamaz - ef codeFirst

User, Address, UserAddress 
public class User 
{ 
    public ICollection<useraddress> userAddresses { get; set; } 
} 

public class Address 
{ 
    public virtual User User { get; set; } 
    public virtual Guid UserId { get; set; } 
    public UserAddress UserAddress { get; set; } 
} 

public class UserAddress 
{ 
    public User User { get; set; } 
    public Guid UserId { get; set; } 
    public Address Address { get; set; } 
    public Guid AddressId { get; set; } 
} 

My sonuçta aşağıdaki gibi görünmelidir: enter image description here

UserAddressConfig:

0123'de aşağıdaki akıcı yapılandırmayı oluşturdum

ve AdddressConfig:

HasOptional(row => row.UserAddress).WithRequired(row => row.Address).WillCascadeOnDelete(); 

ama veritabanını oluşturmak zaman benzer: enter image description here

+0

yerine neden 'User' içinde Address'' bir 'UserId' saklamak? Bu bana mantıklı gelmiyor. – wimh

+0

@Wimmel onun Yabancı Anahtar –

+0

Modelleriniz kapalı gözüküyor. İlk olarak, oluşturulan tablolarla eşleşmiyorlar (bkz. Adres). Akıcı koddaki "row.osman" a bakın. O nedir? Takip etmeyi kesmek, yabancı anahtarların doğru bir şekilde yapılandırılmadığından EF, Address_Id ekliyor gibi görünüyor. https://msdn.microsoft.com/en-us/data/jj591620.aspx#CompositeKey –

cevap

1

bu kullanabilirsiniz:

public class User 
{ 
    public Guid Id { get; set; } 

    [InverseProperty("User")] 
    public ICollection<UserAddress> UserAddresses { get; set; } 
} 

public class Address 
{ 
    public Guid AddressId { get; set; } 

    public UserAddress UserAddresses { get; set; } 
} 

public class UserAddress 
{ 
    public Guid AddressId { get; set; } 

    public Address Address { get; set; } 


    [ForeignKey("UserId")] 
    [InverseProperty("UserAddresses")] 
    public User User { get; set; } 

    public Guid UserId { get; set; }   

} 

ve akıcı API ile konfigürasyonda

:

modelBuilder.Entity<Address>().HasRequired(c => c.UserAddress) 
.WithOptional(c => c.Address) // or any other option 
.WillCascadeOnDelete(false); 

ama aynı zamanda aşağıda gibi kullanıcı ve adres arasındaki birçok ilişkiye birine sahip olabilir:

public class User 
{ 
    public Guid Id { get; set; } 

    [InverseProperty("User")] 
    public ICollection<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public Guid AddressId { get; set; } 

    [ForeignKey("UserId")] 
    [InverseProperty("Addresses")] 
    public User User { get; set; } 

    public Guid UserId { get; set; } 
}