C# 外键列名不同时的实体框架映射

C# 外键列名不同时的实体框架映射,c#,entity-framework,entity-framework-4.1,C#,Entity Framework,Entity Framework 4.1,我有一个这样的遗留表: Country - countryCode (PK, varchar(10), not null) 现在我有了一个新表: Store - store_id - country_code 我的模型: public class Country { [Key] [Column("countryCode") public int CountryCode {get;set;} } public class Store { [Key] [Colu

我有一个这样的遗留表:

Country
- countryCode (PK, varchar(10), not null)
现在我有了一个新表:

Store
- store_id
- country_code
我的模型:

public class Country
{
   [Key]
   [Column("countryCode")
   public int CountryCode {get;set;}
}


public class Store
{
   [Key]
   [Column("store_id")
   public int Id {get;set;}

   [Column("country_code")]
   public int CountryCode {get;set;}
}
现在我希望能够做到这一点:

var store = // get store

store.Country.CountryCode
如何创建此映射注意列名不一样(我无法更改)。

我相信我必须将此添加到我的存储模型中,但是如何具体说明外键的外观,因为它们有不同的名称

public virtual CountryCode {get;set;}

名称与关联无关(尽管相同的名称使db更直观)。通过emdx模型视图,您可以使用一个表单指定关联

这里有一个关于msdn的便捷教程;

如果数据库列的类型为
varchar(10)
,则不能在模型中使用
int
属性,但必须使用
字符串,无论属性名称是否与列名匹配。此外,为了能够从
商店
访问
国家/地区
,您需要一个导航属性
商店。国家/地区

public class Country
{
    [Key]
    [Column("countryCode", TypeName = "varchar")]
    [MaxLength(10)]
    public string CountryCode { get; set; }
}

public class Store
{
    [Key]
    [Column("store_id")
    public int Id { get; set; }

    [Column("country_code", TypeName = "varchar")]
    [MaxLength(10)]
    [Required]
    [ForeignKey("Country")]
    public string CountryCode { get; set; }

    public virtual Country Country { get; set; }
}
(可能不需要使用
ForeignKey
属性。您可以不使用该属性进行尝试。如果表
Store
中的
country\u code
列允许
NULL
值,也可以删除
[必需的]
属性。)

您现在应该能够访问
CountryCode
,例如:

var store = context.Stores.Find(1);
string countryCode = store.Country.CountryCode;

当您访问属性时,
store.Country
导航属性将通过延迟加载自动加载(因此使用了
virtual
修改器)。

这可以工作,谢谢,但是我怎么可以创建一个store对象,保存它,即使我输入了一个假的countryCode。这似乎不是外键关系?如果国家/地区表中不存在PK行,则保存失败。@user1361315:当您使用EF的
[ForeignKey(“Country”)]
属性时,CountryCode
是外键。如果您输入了无效代码并试图保存,则应获得FK冲突异常,假设数据库中还有外键引用约束。