3

我有一个像这样的旧表:

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

如何创建此映射? 请注意,列名不同(我无法更改)。

我相信我必须将其添加到我的 Store 模型中,但是我如何指定外键的外观,因为它们具有不同的名称?

public virtual CountryCode {get;set;}
4

2 回答 2

2

如果您的数据库列的类型为 ,varchar(10)则您不能int在模型中使用属性,但必须使用string,无论属性名称是否与列名称匹配。此外,为了能够访问CountryStore需要一个导航属性Store.Country

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属性可能不是必需的。您可以在没有它的情况下尝试它。如果表中的列允许值,也请删除该[Required]属性。)country_codeStoreNULL

您现在应该可以访问CountryCodewith 例如:

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

当您访问该属性时,store.Country导航属性将通过延迟加载(因此是virtual修饰符)自动加载。

于 2013-04-25T17:44:45.467 回答
0

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

这是一个方便的msdn教程; http://blogs.msdn.com/b/efdesign/archive/2009/03/16/foreign-keys-in-the-entity-framework.aspx

于 2013-04-25T16:49:55.647 回答