0

У меня есть отношения 1-к-0..1, определенный в Entity Framework кода первой модели, как это:Entity Framework Code First: 1: 0..1 Изменение внешнего ключа Расположение

public class Album 
{ 
    public int AlbumId { get; set; } 

    public int StampId { get; set; } 

    public Stamp Stamp { get; set; } 

    // other properties 
} 

public class Stamp 
{ 
    public int StampId { get; set; } 

    public int AlbumId { get; set; } 

    [Required] 
    public Album Album { get; set; } 

    // other properties 
} 

Зв альбом имеет 0..1 штампов, у штампа всегда есть ровно один альбом. Конфигурация, которую я здесь, работает хорошо. Однако, когда я смотрю, какие столбцы генерируются в базе данных, я немного недоволен: внешний ключ создается в таблице Album .., что делает его жестким/медленным, чтобы вставлять новые штампы, поскольку вам всегда нужно изменить таблицу Album и обновить внешние ключи StampId. (Это означает, что мне нужно отслеживание изменений для изменения этих полей)

Как я могу указать Entity Framework создать внешний ключ в таблице Stamp?

Я также не знаю, какую роль должно играть объявление свойств навигации в этом контексте .. имеет ли значение эти свойства, определенные в обоих направлениях?

ответ

1

Хорошо, я понял это, используя хорошие примеры, которые я нашел здесь: http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

Хитрость заключается в том, чтобы использовать внешнюю клавишу «ALBUMID» в таблицы «Марки» в качестве первичного ключа. Таким образом, подразумевается, что идентификаторы Stamp не будут основным ключом и что первичный ключ будет иметь «пробелы» для идентификаторов, которые не существуют. Иными словами, делая это, вы гарантируете, что в одном альбоме есть только один Stamp. Поскольку эта концепция немного раздражает, one can still simulate UID 'StampID', который увеличивается каждый раз, когда вы добавляете новую запись.

Так в моем примере это будет:

public class Album 
{ 
    public int AlbumId { get; set; } 

    public Stamp Stamp { get; set; } 

    // other properties 
} 

public class Stamp 
{ 
    [Index(IsUnique = true)] // another UID, just to follow the naming pattern   
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int StampId { get; set; } 

    [Key, ForeignKey("Album")] // The PK, taken as FK from the associated Album 
    public int AlbumId { get; set; } 

    [Required] // the required attribute just makes validation errors more readable 
    public Album Album { get; set; } 

    // other properties 
}