Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有实体框架的外键一对一_C#_.net_Entity Framework - Fatal编程技术网

C# 具有实体框架的外键一对一

C# 具有实体框架的外键一对一,c#,.net,entity-framework,C#,.net,Entity Framework,客户只能使用一种语言。我没有找到创建密钥的正确方法。当我得到一个对象Customer时,属性LanguageId有一个内容,但没有属性语言。我使用EF6.1 此语言对象将在其他对象中使用 我这样做: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

客户只能使用一种语言。我没有找到创建密钥的正确方法。当我得到一个对象Customer时,属性LanguageId有一个内容,但没有属性语言。我使用EF6.1

此语言对象将在其他对象中使用

我这样做:

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);