EF6.1代码优先映射或表注释

时间:2014-06-03 09:10:44

标签: c# entity-framework ef-code-first

我正在尝试设置以下两个模型,但无法弄清楚如何使用数据注释或流畅的API来实现。任何人都可以建议正确的注释或Fluent API代码吗?

public class Vehicle
{
   public int ID { get; set; }
   public int JobID { get; set; }
   public int StatusID { get; set; }
   public string Name { get; set; }

   public virtual Job Job { get; set }
   public virtual Status Status { get; set; }
}

public class Job
{
   public int ID { get; set; }
   public int VehicleID { get; set; }
   public int StatusID { get; set; }
   public string Description { get; set; }

   public virtual Vehicle Vehicle{ get; set; }
   public virtual Status Status { get; set; }
}

我遇到的问题是从车辆,车辆到工作的工作模型的引用。在数据库中,Jobs表包含所有待处理或已完成的作业。可能有也可能没有与之相关的车辆(当作业正在进行或完成时,车辆将与之相关联)。对于车辆表,JobID表示分配给车辆的当前作业(如果已分配作业)并且将在当天不断变化,但应该对作业表没有影响。

1 个答案:

答案 0 :(得分:1)

以下代码段概述了您所描述的关系的流畅代码优先示例:

public class Vehicle
{
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual Job Job { get; set; }
}

public class Job
{
    public int ID { get; set; }
    public string Description { get; set; }
}

public class AppDataContext : DbContext
{
    public DbSet<Vehicle> Vehicles { get; set; }
    public DbSet<Job> Jobs { get; set; }

    protected override void OnModelCreating(DbModelBuilder mb)
    {
        mb.Entity<Job>().HasKey(x => x.ID);
        mb.Entity<Vehicle>().HasKey(x => x.ID);
        mb.Entity<Vehicle>().HasOptional(x => x.Job).WithOptionalDependent();

        // ... other config, constraints, etc
    }
}

让乔布斯与车辆联系:

using (var context = new AppDataContext())
{
    var query = context.Vehicles.Where(x => x.Job != null).Select(x => x.Job);
    // ...
}

恕我直言,除非严格要求,否则应将明确的外键属性保留在模型之外。这往往使生活更轻松,并保持代码清洁。

希望这与您正在寻找的内容相符......


P.S。 - 冒着只发布链接的风险&#39; - 如果您已有数据库(如您的问题所暗示的那样),则可能值得考虑数据库优先方法:http://msdn.microsoft.com/en-gb/data/jj206878.aspx ..或Code First与现有数据库:http://msdn.microsoft.com/en-us/data/jj200620