具有Entity Framework的外键一对一

时间:2014-08-10 15:05:03

标签: c# .net entity-framework

Customer只能有一个Language。我找不到创建密钥的正确方法。当我获得对象Customer时,属性LanguageId包含内容但不包含属性Language。我使用EF 6.1

Language对象将用于其他对象。

我这样做了:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Configurations.Add(new CustomerMap());
    modelBuilder.Configurations.Add(new LanguageMap());   
}

public class Customer
{
    public int CustomerID { get; set; }
    public string Code { get; set; }

    public int LanguageId { get; set; }
    [ForeignKey("LanguageId")]
    public Language Language { get; set; }
}

public class CustomerMap : EntityTypeConfiguration<Customer>
{
    public CustomerMap()
    {
        this.HasKey(t => t.CustomerID);

        // Properties
        this.Property(t => t.CustomerID).IsRequired();
        this.Property(t => t.Code).IsRequired();

        // Table & Column Mappings
        this.ToTable("Customer");
        this.Property(t => t.CustomerID).HasColumnName("CustomerID");
        this.Property(t => t.Code).HasColumnName("Code");
    }
}

public class Language
{
    public int LanguageID { get; set; }
    public string Code { get; set; }
}

public class LanguageMap : EntityTypeConfiguration<Language>
{
    public LanguageMap()
    {
        this.HasKey(t => t.LanguageID);
        this.Property(t => t.Code).IsRequired();
    }
}

更新(语言将用于其他对象)

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用两个选项实现一对一,但首先必须删除主体中的外键值。 Principal意味着记录必须首先存在,这就是为什么这个实体不需要具有外键值,只需要外键引用。

删除此代码。

public int LanguageId { get; set; }
[ForeignKey("LanguageId")]

<强>第一即可。删除上面的代码后添加此配置。

modelBuilder.Entity<Customer>()
    .HasRequired(a => a.Language)
    .WithRequiredPrincipal();

第二,还在依赖(Language)上添加外键引用。

public Customer Customer { get; set; }

然后在WithRequiredPrincipal中提及主要参考资料。

modelBuilder.Entity<Customer>()
    .HasRequired(a => a.Language)
    .WithRequiredPrincipal(x => x.Customer);

更新

要加载语言,您可以通过添加虚拟关键字来延迟加载(上下文配置还必须启用延迟加载和代理)。

public virtual Language Language { get; set; }

或者急切加载。

var customerID = 5;
var customer = db.Set<Customer>().Include(c => c.Language)
   .FirstOrDefault(c => c.CustomerID == customerID);