EF Code-First Композитный ключ "Навигация" - PullRequest
1 голос
/ 31 августа 2011

Я искал уже отвеченные вопросы, но не нашел ответа на свою проблему. Позор мне.

У меня такая ситуация:

public class Content
{
    [Key]
    [StringLength(36, ErrorMessage="Must have 36 characters")]
    [Required(ErrorMessage="Must have a unique GUID")]
    public string GUID { get; set; }

    public virtual ICollection<RegionalInfo> RegionalInfo { get; set; }
}

public class RegionalInfo
{
    [Key]
    public virtual Content Content { get; set; }

    [Key]
    public virtual Region Region { get; set; }
}

public class Region
{
    [Key]
    [StringLength(5, ErrorMessage="ID must have 5 characters")]
    [Required]
    [RegularExpression(@"[a-z]{2}-[A-Z]{2}", ErrorMessage = "ID must be in ISO 639 standard")] 
    public string ID { get; set; }

    public string Country { get; set; }

    public string Language { get; set; }
}

Но я не могу заставить это работать. EF говорит, что «RegionalInfo не имеет определенного ключа».

Короче, я пытаюсь создать составной ключ для этого класса "RegionalInfo", который включает Content.GUID и Region.ID.

Для каждого отдельного УНИКАЛЬНОГО контента в таблице «Содержимое» в таблице «Региональная информация» будет много «Переводов».

1 Ответ

2 голосов
/ 01 сентября 2011

Я предполагаю, что вы используете DbContext.В соответствии с этим предположением вы должны определить свои ключи в классе RegionalInfo следующим образом:

public class RegionalInfo
{
    [Key]
    public String ContentId { get; set; }
    public virtual Content Content { get; set; }

    [Key]
    public string RegionId { get; set; }
    public virtual Region Region { get; set; }
}

, а в своем классе контекста вы сделаете следующее:

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        // Composite key definition
        modelBuilder.Entity<RegionalInfo>().HasKey(x => new { x.ContentId, x.RegionId });
        // And if I remember correctly this was required in order to do
        // var x = contentObject.RegionalInfo.Where(....) stuff
        modelBuilder.Entity<RegionalInfo>().HasRequired<Content>(x => x.Content).WithMany(x => x.RegionalInfo).HasForeignKey(x => x.ContentId);
    }

Это должно сработать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...