C# 具有实体框架的外键一对一
客户只能使用一种语言。我没有找到创建密钥的正确方法。当我得到一个对象Customer时,属性LanguageId有一个内容,但没有属性语言。我使用EF6.1 此语言对象将在其他对象中使用 我这样做:C# 具有实体框架的外键一对一,c#,.net,entity-framework,C#,.net,Entity Framework,客户只能使用一种语言。我没有找到创建密钥的正确方法。当我得到一个对象Customer时,属性LanguageId有一个内容,但没有属性语言。我使用EF6.1 此语言对象将在其他对象中使用 我这样做: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
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();
}
}
更新语言将在其他对象中使用
您可以通过两个选项实现一对一,但首先必须删除主体中的外键值。主体意味着记录必须首先存在,这就是为什么这个实体不需要外键值,只需要外键引用
删除此代码
public int LanguageId { get; set; }
[ForeignKey("LanguageId")]
首先。删除上述代码后,添加此配置
modelBuilder.Entity<Customer>()
.HasRequired(a => a.Language)
.WithRequiredPrincipal();
然后在WithRequiredPrincipal中提及主要参考
或者用急切的装载
var customerID = 5;
var customer = db.Set<Customer>().Include(c => c.Language)
.FirstOrDefault(c => c.CustomerID == customerID);
此代码能否编译modelBuilder.Entity.HasRequireda=>a.Language.WithRequiredDependent.HasForeignKeyu=>u.LanguageId?我的意思是,WithRequiredDependent可以用HasForeignKey继续吗?对不起,我的错误,这部分代码是测试。我删除了它。我认为你想要实现的是一种语言对许多客户,一种语言对许多产品。你当然是对的。EF中的一对多非常奇怪,您的代码已经正确,您已经用[ForeignKeyLanguageId]提到过,即使没有外键属性,约定也可以发现关系,因为它也适合在“语言”中添加“客户”?我将在“Employee”中使用此语言表,并使用更多objectsHmm,因此它不是一对一,因为此语言可以由其他实体拥有,即使不在语言上添加Customer属性,代码仍然是一对一对Customer的
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);