EF CTP4: только для кода, генерация базы данных не требуется, сколько информации о БД необходимо? - PullRequest
0 голосов
/ 02 сентября 2010

У меня есть база данных, и у меня есть POCO объекта, и все, для чего я хочу использовать EF, - это сопоставление между ними и отслеживание изменений для загрузки, сохранения и т. Д.

Я читал много литературы (такой, как она есть) по «Первому коду», и мне неясно, сколько информации о базе данных мне нужно предоставить, когда база данных не будет сгенерирована.

Например, нужно ли EF знать, какие свойства являются ключами, максимальная длина строковых свойств, отношения между таблицами и т. Д.? Или, если ему нужно знать, может ли он получить эту информацию из самой базы данных? Другими словами, должен ли я предоставлять аннотации [Key] и тому подобное, или предоставлять информацию о конфигурации, детализирующую отношения внешнего ключа, если не требуется создавать базу данных?

ОБНОВЛЕНИЕ: Чтобы прояснить ситуацию, я говорю о следующем коде. Я должен вручную создать этот класс, производный от DbContext. Я мог бы предоставить много информации БД о свойствах в OnModelCreating или в атрибутах, связанных со свойствами в классах сущностей.

    public class SchedulerContext : DbContext
    {
    public SchedulerContext(EntityConnection connection)
        : base(connection)
    {
    }

    public DbSet<Client> Clients { get; set; }
    public DbSet<ConsultantDistrict> ConsultantDistricts { get; set; }
    public DbSet<ConsultantInterviewSetting> ConsultantInterviewSettings { get; set; }
    public DbSet<ConsultantUnavailable> ConsultantsUnavailable { get; set; }
    public DbSet<CustomEmailTemplate> CustomEmailTemplates { get; set; }
    public DbSet<DateEvent> DateEvents { get; set; }
    public DbSet<Event> Events { get; set; }
    public DbSet<EventItem> EventItems { get; set; }
    public DbSet<EventItemUserViewed> EventItemsUserViewed { get; set; }
    public DbSet<FlaggedDate> FlaggedDates { get; set; }
    public DbSet<Interview> Interviews { get; set; }
    public DbSet<Interviewee> Interviewees { get; set; }
    public DbSet<IntervieweeNote> IntervieweeNotes { get; set; }
    public DbSet<InterviewEvent> InterviewEvents { get; set; }
    public DbSet<NotificationSent> NotificationsSent { get; set; }
    public DbSet<SchedulerRole> SchedulerRoles { get; set; }
    public DbSet<SiteEvent> SiteEvents { get; set; }
    public DbSet<UnavailableHour> UnavailableHours { get; set; }
    public DbSet<UserLogin> UserLogins { get; set; }
    public DbSet<UserSites> UserSites { get; set; }
    public DbSet<Visit> Visits { get; set; }

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ConsultantUnavailable>().MapSingleType().ToTable("ConsultantsUnavailable");
        modelBuilder.Entity<EventItemUserViewed>().MapSingleType().ToTable("EventItemsUserViewed");
    }
}

1 Ответ

1 голос
/ 02 сентября 2010

Да, EF требует информацию о string длинах полей, внешних ключах и т. Д. В модели.Например, если DB FK имеет каскад, EF должен это знать, чтобы он не заставлял вас вручную удалять подробные записи;если EF знает о каскаде, он позволит БД справиться с этим.Точно так же, если EF знает, что ключ генерируется хранилищем (например, автоматически увеличивается), он не будет жаловаться, если вы не установите его для новой записи, поскольку он будет предполагать, что это сделает БД.

Однако подход, основанный только на коде, использует подход «соглашение поверх конфигурации».Вам не нужно указывать значения, которые EF может угадать. Вы можете прочитать о них здесь .

Если вы выполняете только код, EF вообще не смотрит на БД при создании модели.

Невозможно заставить EF взглянуть на код и БД для создания модели.Вы должны выбрать один или другой.

...