0

我有一个数据库,我有实体POCO的,我想使用EF的所有我想要在两者之间进行映射并跟踪加载,保存等的更改。EF CTP4:仅用于代码,不需要生成数据库,需要多少数据库信息?

我一直在阅读很多关于“Code First”的文献(比如它),并且我不清楚在不会生成数据库时需要提供多少数据库信息。

例如,EF是否需要知道哪些属性是键,字符串属性的最大长度,表之间的关系等?或者如果它确实需要知道,它是否可以从数据库本身获取这些信息?换句话说,如果不需要创建数据库,是否必须提供[Key]注释等,或者提供详细说明外键关系的配置信息?

更新:为了使事情更清楚些,下面的代码就是我正在谈论的内容。我必须手动创建从DbContext派生的这个类。我可以提供关于OnModelCreating中的属性或附加到实体类中属性的属性的大量DB信息。

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

是的,EF 需要对string字段长度,外键等信息,在模型中。例如,如果DB FK具有级联,则EF需要知道这一点,以便它不会强制您手动删除详细记录;如果EF知道级联,它将让DB处理。同样,如果EF知道一个密钥是商店生成的(例如,自动递增的),那么当它没有设置在新记录上时它不会抱怨,因为它会假定DB会这样做。

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

如果您只做Code Only,EF在创建模型时根本不会查看数据库。

有没有办法告诉EF看代码 DB创建模型。你必须选择一个或另一个。

+0

我明白。我不是在谈论使用EF从数据库创建模型。但是我提供了一个连接字符串给上下文对象。它必须知道关于数据库的一些信息才能保存数据。我只是想知道,如果它不打算创建数据库,它是否需要知道一切(键,关系等)。 – Cynthia 2010-09-02 16:10:22

+0

在进一步阅读中,似乎您可能必须将所有内容都提供给上下文对象,因为您必须在内存中重新创建EDMX文件中通常以XML格式提供的所有数据。但我不确定...请继续关注。 – Cynthia 2010-09-02 16:12:24

+0

我已更新我的帖子以包含我关注的焦点所在的代码。 – Cynthia 2010-09-02 16:21:51