0

我有一个数据库,我有实体 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");
    }
}
4

1 回答 1

1

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

但是,纯代码方法采用“约定优于配置”的方法。您不必指定 EF 可以猜测的值。你可以在这里阅读这些

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

没有办法告诉 EF 查看代码DB 来创建模型。你必须选择其中之一。

于 2010-09-02T12:49:13.680 回答