2014-01-24 1 views
4

Я пытаюсь построить 1-1 отношения - арендатор имеет URL-адрес, и наоборот:один на один в EF только производить один внешний ключ

Модели

public class Tenant { 

    [Key] 
    [Required] 
    public int TenantId { get; set; } 

    public string Name { get; set; } 

    public virtual Url Url { get; set; } 
    public int UrlId { get; set; } 

} 

public class Url { 

    [Key] 
    [Required] 
    public int UrlId { get; set; } 

    public string Name { get; set; } 

    public virtual Tenant Tenant { get; set; } 
    public int TenantId { get; set; } 
} 

Configs

public class UrlConfiguration : EntityTypeConfiguration<Url> { 
    public UrlConfiguration() { 

     HasKey(s => s.UrlId); 

    } 
} 
public class TenantConfiguration : EntityTypeConfiguration<Tenant> 
{ 
    public TenantConfiguration() { 
     HasRequired(s => s.Url).WithRequiredPrincipal(s => s.Tenant); 
    } 
} 

Результат:

enter image description here

Я ожидаю, что на обеих моделях будет внешний ключ ... почему это не так?

ответ

6

Индивидуальная связь с обоими концами с требуемыми внешними ключами не может существовать в реляционной базе данных. Если для сохранения новой записи Tenant требуется запись URL-адреса, но для создания этой записи URL-адреса, для этого URL-адреса требуется запись Tenant, с чего вы начнете?

Несмотря на то, что на уровне базы данных он практически не может существовать, эта модель все равно будет работать. По моему опыту, Entity Framework будет обеспечивать зависимость от уровня приложения и будет генерировать EntityException, когда обнаруживает, что одна из сущностей, которую вы пытаетесь сохранить, не имеет отношения к одному из других.
Создает эту модель базы данных, чтобы она могла сохранять ваши сущности и обеспечивать соблюдение отношений на уровне приложений.

Нет, это не хорошо на уровне базы данных, так как там не будет принудительно установлено ограничение «один-к-одному». Если вам также нужны ограничения базы данных, рассмотрите возможность объединения таблиц или перепроектирования ваших структур данных, чтобы отношения «один-к-одному» не были необходимы.

+0

Это не совсем так, в SQL Server, например, вы можете [отказаться от ограничений] (http://www.w3schools.com/sql/sql_foreignkey.asp), чтобы вы могли эффективно иметь 1-1 отношения в обоих концах. –

+0

Отбросить все ограничения, конечно, не приведет к одному ограничению, Бруно ... – Olaf

+0

Я имел в виду, что они временно выходят ... Просто ради того, чтобы сначала добавить один из этих кортежей. –