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冲突异常,假设数据库中还有外键引用约束。