EF CTP4: как определить, что EF столбец НЕ является идентификатором - PullRequest
1 голос
/ 13 сентября 2010

У меня есть проект POCO с первым кодом, в котором я пытаюсь настроить существующую базу данных так, чтобы она синхронизировалась с тем, что ожидает EF, учитывая мою существующую модель.

У меня есть эти сущности:

public class FlaggedDate
{
    [Key]
    public long scheduledDayID { get; set; }
    [Required]
    public DateTime date { get; set; }
    [StringLength(50)]
    [Required]
    public string dateStatus { get; set; }
    [Required]
    public bool isVisit { get; set; }
    [Required]
    public bool hasAvailableSlots { get; set; }
    [Required]
    public bool hasInterviewsScheduled { get; set; }

    // navigation properties
    public ICollection<ScheduledSchool> scheduledSchool { get; set; }
    public ICollection<Interview> interviews { get; set; }
    public ICollection<PartialDayAvailableBlock> partialDayAvailableBlocks { get; set; }
    public Visit visit { get; set; }
    public ICollection<Event> events { get; set; }
}

и

public class Visit
{
    [Key]
    public long flaggedDateScheduledDayID { get; set; }
    [Required]
    public bool isFullDay { get; set; }

    // navigation property
    public FlaggedDate flaggedDate { get; set; }
}

Соотношение между этими двумя значениями равно 1: 0 | 1, т. Е. FlaggedDate будет существовать, но может иметь или не иметь соответствующий единственный объект Visit.

EF считает, что на основе этой модели у FlaggedDate должно быть дополнительное поле visit_flaggedDateScheduledDayID, которое можно обнулять. Я наконец понял, почему: он считает, что поле Visit, flaggedDateScheduledDayID, является столбцом идентификаторов. Это не должен быть столбец идентификации; это должен быть внешний ключ, который подключается к FlaggedDate.

Я думаю, что это происходит по соглашению: я помню, как читал что-то о том, что в CTP4 любое поле, которое является одним ключом и имеет значение int или long, считается столбцом идентификации.

Можно ли как-нибудь сказать EF, что это НЕ столбец идентификации? Я попытался поиграть с Fluent API, но для меня это загадка, и нет аннотаций данных, которые вы можете использовать для этого.

Или, в качестве альтернативы, я могу поэкспериментировать со свойствами навигации, чтобы все получилось правильно?

Ответы [ 2 ]

3 голосов
/ 30 мая 2013

Если вы используете файлы сопоставления с свободно используемым API

this.Property(t => t.Id)
   .HasColumnName("Site_ID")
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

Я бы предположил, что он также должен работать декларативно

[HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)]

, хотя я не пробовал.

0 голосов
/ 14 сентября 2010

Я обнаружил, что могу переопределить поведение идентификации с помощью этого кода:

 modelBuilder.Entity<Visit>().Property(v => v.flaggedDateScheduledDayID).StoreGeneratedPattern = System.Data.Metadata.Edm.StoreGeneratedPattern.None;

Однако, он все еще не делает его внешним ключом.Думаю, это другой вопрос.Кажется, установка StoreGeneratedPattern на None - это способ переопределить поведение по умолчанию.

...