Используйте многостолбцовый (составной) первичный ключ, который включает отношение внешнего ключа - PullRequest
1 голос
/ 02 марта 2012

Я использую Entity Framework 4.3 с простым дизайном:

public class Post
{
    [Key]
    public int ID { get; set; }

    public string Text { get; set; }

    public HashSet<PostTag> Tags { get; set; }
}

public class PostTag
{
    public Post Post { get; set; }

    [Key, Column(Order=0)]
    [ForeignKey("Post")]
    public int PostID { get; set; }

    [Key, Column(Order=1)]
    [MaxLength(50)]
    public string Tag { get; set; }
}

Таким образом, вы можете видеть, что сообщение имеет несколько тегов, и эти теги используют составной первичный ключ и PostID и тега.

Когда я бегу update-database, я получаю:

Cannot define PRIMARY KEY constraint on nullable column in table 'PostTag'.

Я пытался применить атрибут [Required] к Post и PostID. Я попытался поместить атрибут ForeignKey на другую сторону отношения FK. Я попытался применить атрибут InverseProperty к Post (который изменяет ошибку только на неопределенное NullReferenceException - это похоже на ошибку).

1 Ответ

0 голосов
/ 02 марта 2012

Как оказалось, если я помещу InverseProperty в HashSet, EF может перенести БД, но только если она чистая:

public class Post
{
    ...
    [InverseProperty("Post")]
    public HashSet<PostTag> Tags { get; set; }
}

Если я перейду из класса PostTag, который выглядит следующим образом:

public class PostTag
{
    public Post Post { get; set; }

    [Key]
    [ForeignKey("Post")]
    public int PostID { get; set; }

    [Key]
    [MaxLength(50)]
    public string Tag { get; set; }
}

Я получаю исключение:

'FK_PostTag_Post_Post_ID' не является ограничением. Не удалось отбросить ограничение. Смотрите предыдущие ошибки.

Похоже, что это может быть ошибка в EF Code First, в которой он позволяет применять Composite Key к этим свойствам, но фактически не применять его в базе данных (таблица, полученная из приведенного выше кода, имела PK с одним столбцом на теге).

...