EF中的一对一只生成一个外键

时间:2014-01-24 15:26:07

标签: entity-framework ef-code-first entity-framework-6

我正在尝试建立1-1关系 - 租户有一个Url,反之亦然:

模型

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

我希望两种型号都有外键......为什么不是这种情况?

1 个答案:

答案 0 :(得分:6)

关系数据库中不存在具有所需外键的两端的一对一关系。如果保存新的租户记录需要URL记录,但为了创建该URL记录,该URL需要租户记录,您将从哪里开始?

即使在数据库级别它实际上不存在,这个模型仍然可以工作。根据我的经验,Entity Framework将强制执行对应用程序级别的依赖,并在检测到您尝试保存的某个实体与另一个实体没有任何关系时抛出EntityException。 它创建此数据库模型,以便它仍然可以保存您的实体,并在应用程序级别上强制执行关系。

不,这在数据库级别上并不好,因为那里不会强制执行一对一约束。如果您还需要数据库约束,请考虑合并表或重新设计数据结构,以便不需要一对一的关系。