2016-02-09 5 views
0

Я боюсь здесь. Я пробовал через аннотации данных и через Fluent API и все еще не работает правильно. Отчаявшись помочь сейчас. В принципе, у меня есть две таблицы. Таблица компаний и адресная таблица. Компания должна иметь адрес головного офиса (который должен проживать в адресной таблице), и адрес должен иметь компанию, которая также принадлежит. Я действительно стараюсь правильно настроить это.Entity Framework 1: 1 отношение Код Первый

Я поставлю код First Entities, а затем покажу, что у меня уже есть.

[Table("Address")] 
public class Address 
{ 
    [Key] 
    public long AddressId { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string Address3 { get; set; } 
    public string Address4 { get; set; } 
    public string Address5 { get; set; } 
    public string Town { get; set; } 
    public string County { get; set; } 
    public string Country { get; set; } 
    public string PostCode { get; set; } 
    public virtual Company Company { get; set; } 
    public DateTime? RemovedDate { get; set; } 
    public long? RemovedBy { get; set; } 
} 

[Table("Company")] 
public class Company 
{ 
    [Key ] 
    public long CompanyId { get; set; } 
    public string Name { get; set; } 
    public string WebsiteUrl { get; set; } 
    public virtual Address Address { get; set; } 
    public User LeadUser { get; set; } 
    public DateTime ActiveSince { get; set; } 
    public DateTime? ActiveTill { get; set; } 
    public string VatRegistration { get; set; } 
    public string LicenseKey { get; set; } 
    public LicenseStatus LicenseStatus { get; set; } 
    public bool CanAgreementBeExtended { get; set; } 
    public string BillingEmail { get; set; } 
    public string PhoneNumber { get; set; } 
    public string MobileNumber { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateUpdated { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
    public virtual ICollection<LicenseHistory> LicenseHistories { get; set; } 
} 

//Seeded data inserted as follows 
var testCompany = new Company 
          { 
           ActiveSince = DateTime.UtcNow, 
           Name = "Test Company", 
           LeadUser = adminUser, 
           DateCreated = DateTime.UtcNow, 
           DateUpdated = DateTime.UtcNow, 
           BillingEmail = "[email protected]", 
           CanAgreementBeExtended = true, 
           LicenseStatus = LicenseStatus.PendingAgreement, 
           MobileNumber = "1234567890", 
           PhoneNumber = "1234567890", 
           VatRegistration = "1234567890" 
          }; 

     context.Companies.AddOrUpdate(u => u.Name, testCompany); 

var testAddress = new Address 
     { 
      Address1 = "Test Ltd", 
      Address2 = "1 Test Gardens", 
      Address3 = "Test Heath", 
      Address4 = string.Empty, 
      Address5 = string.Empty, 
      County = "Test", 
      Town = "Test", 
      Country = "United Kingdom", 
      PostCode = "TE5 T11", 
      Company = testCompany 
     }; 

     context.Addresses.AddOrUpdate(u => new { u.AddressId }, testAddress); 

     testCompany.Address = testAddress; 

     context.Companies.AddOrUpdate(u => u.Name, testCompany); 

//Fluent API set up as follows in the OnModelCreating 
      modelBuilder.Entity<Address>() 
        .HasRequired(ad => ad.Company) 
        .WithOptional(s => s.Address); 

Может ли кто-нибудь определить, что я делаю неправильно? Последние несколько дней я играл с различными комбинациями, и это просто не работает. Я просто продолжаю получать ошибки, последняя ошибка на основе вышеприведенного кода ...

Зависимое свойство в ссылочной привязке сопоставляется с созданным магазином столбцом. Столбец: «AddressId».

Любые идеи, пожалуйста?

ответ

0

Вы не можете иметь истинное один к одному в SQL Server (см How do I create a real one-to-one relationship in SQL Server), но есть обходной путь в EF, где вы делаете первичный ключ второго объекта также является внешним ключом:

// [Table("Company")] -- not needed unless different 
public class Company 
{ 
    // [Key ] -- will be key by convention 
    public long CompanyId { get; set; } 
    ... 
    public virtual Address Address { get; set; } 
} 

public class Address 
{ 
    [Key, ForeignKey("Company")] 
    public long AddressId { get; set; } 
    public string Address1 { get; set; } 
    ... 
    public virtual Company Company { get; set; } 
} 

Вы также можете сделать это с беглым кодом, как:

modelBuilder.Entity<Company>() 
    .HasRequired(t => t.Address) 
    .WithRequiredPrincipal(t => t.Company); 
+0

Спасибо за ответ, я видел этого раньше на моем тралении в Интернете для решения, но это не тихий матча, что я после , Поскольку таблица адресов и таблица компаний используются вместе и независимо друг от друга, у каждого из них есть набор идентификаторов на их ПК. Идея заключается в том, что у компании может быть только один адрес (который является их головным офисом), но компания может владеть несколькими адресами (следовательно, адрес имеет столбец Компании). Это позволяет мне получить адрес головного офиса компаний, а также все адреса, принадлежащие компании. Есть идеи, как это сделать? –

+0

Ran из символов:) ..... Я сделал эту настройку, создавая сами таблицы БД, но не могу представить ее в EF. :( –

+0

У нас есть что-то подобное, когда у человека много адресов, один из которых является основным адресом. Мы пошли много ко многим с тремя таблицами. Person, Address, PersonAddress. PersonAddress имеет navs для Person и Address, а также флаг IsPrimaryAddress У каждого человека и адреса есть коллекция PersonAddresses для навигационных целей. Вот хорошее объяснение: https://lostechies.com/jimmybogard/2014/03/12/avoid-many-to-many-mappings-in-orms/ –

Смежные вопросы