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();
}
}
更新(语言将用于其他对象)
答案 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);