EF如何定义没有FK的关系

时间:2014-01-10 03:07:09

标签: c# entity-framework ef-code-first

我有两个看起来像这样的模型:

   [Table("Titles")]
    public partial class Title
    {
        [Key]
        [Column("TitleId")]


        public virtual string Genre { get; set; }

        [ForeignKey("Genre")] // I want to link using the Genre field
        public virtual Genre GenreInfo { get; set; }

    }

    [Table("Genres")]
    public partial class Genre
   {

        [Key]       
        [Column("GenreID")]
        public int GenreID { get; set; } *** This is the actual PK in the table


        public string Genre { get; set; } // This contains unique genre code.

        public string Keywords { get; set; }

     }

标题表中的foreignKey是字段“Genre”而不是GenreId。如何在Title模型中定义使用Genre字段加载类型infor的关系?

这是多对一的关系。 (标题只能有一种类型)

2 个答案:

答案 0 :(得分:1)

你能试试这个......?

public partial class Title
{
    public virtual string Genre { get; set; }
    public virtual Genre GenreInfo { get; set; }
}


public partial class Genre
{
    public int GenreID { get; set; }
    public string sGenre { get; set; } // This contains unique genre code.
    public string Keywords { get; set; }

}

和DbContext

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
       modelBuilder.Entity<Title>()
       .HasOptional(b => b.GenreInfo)
       .WithRequired().Map(x => x.MapKey("sGenre")); 
    }

答案 1 :(得分:0)

我不会那样对这些类进行建模。我这样做:

    public class Title
    {
        public int Id   //or TitleId if you prefer

        public int GenreId { get; set; }

        public virtual Genre Genre { get; set; }
    }


   public class Genre
   {
        public int Id { get; set; }   //or GenreId if you prefer

        ["Required"]
        public string Name{ get; set; }

        public string Keywords { get; set; }
   }
  1. 定义关系不需要数据注释或流畅的API,因为一切都遵循惯例

  2. 您无需更新标题表中的外键即可更改流派的名称

  3. 连接外键的表,这是一个int而不是字符串 - 所以可能更有效率

  4. 现在你必须确保Name是唯一的。我这样做是为自然键添加索引并在DbContext中使用ValidateEntity进行验证。有关here

    的更多信息

    请注意,您很快就能specify an index using data annotations