EF CTP4:仅限代码,不需要生成数据库,需要多少DB信息?

时间:2010-09-01 20:15:44

标签: entity-framework entity-framework-4 entity-relationship ado.net-entity-data-model

我有一个数据库,我有实体POCO,而我想要使用EF的是在两者之间进行映射并跟踪加载,保存等的变化。

我一直在阅读“Code First”中的大量文献(例如它),而且我不清楚在没有数据库生成时我需要提供多少数据库信息。

例如,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 个答案:

答案 0 :(得分:1)

是的,EF 需要模型中string字段长度,外键等信息。例如,如果DB FK具有级联,则EF需要知道这一点,以便它不会强制您手动删除详细记录;如果EF知道级联,它将让DB处理它。类似地,如果EF知道密钥是存储生成的(例如,自动递增),则当您不将其设置在新记录上时它不会抱怨,因为它将假定DB将执行该操作。

但是,仅代码方法采用“约定优于配置”方法。您不必指定EF可以猜出的值。 You can read about those here

如果您正在执行“仅代码”,则在创建模型时,EF根本不会查看数据库。

无法告诉EF查看代码数据库来创建模型。你必须选择其中一个。