使用外键创建CodeFirst模型

时间:2013-10-03 20:49:34

标签: c# asp.net-mvc-3 entity-framework

我是ASP.NET和EF的新手,但拥有Ruby MVC经验。我正在开发一个具有一对多关系的复杂应用程序,因此我创建了一个小型项目,我可以使用它并测试CodeFirst一代,比使用吉他项目测试更有趣!你们所有的音乐家都知道一对多的关系,因为一位吉他手拥有几把吉他和放大器。这段代码的工作原理是它在我播种时创建了数据库和表格 - 只是想就如何做得更好以及任何可能的问题提出一些建议?

由于

namespace GuitarCollector.Models
{
 public class Guitarist
 {

    public Guitarist()
    {
        Guitars = new List<Guitar>();
        Amplifiers = new List<Amplifier>();
    }

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public List<Guitar> Guitars { get; set; }
    public List<Amplifier> Amplifiers { get; set; }
}

public class Guitar
{
    //Primary Key
    public int Id { get; set; }
    //Foreign Key
    public int GuitaristId { get; set; }

    public int YearOfManufacture { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
    public string Finish { get; set; }
    public string SerialNumber { get; set; }
    public double AppraisedValue { get; set; }

    Guitarist Guitarist { get; set; }
}

 public class Amplifier
{
    //Primary Key
    public int Id { get; set; }
    //Foriegn Key
    public int GuitaristId { get; set; }

    public int YearOfManufacture { get; set; }
    public int Wattage { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
    public string SerialNumber { get; set; }
    public double AppraisedValue { get; set; }

    public Guitarist Guitarist { get; set; }
}

}

命名空间GuitarCollector.DAL    {     公共类GuitaristContext:DbContext     {

    public DbSet<Guitarist> Guitarists { get; set; }
    public DbSet<Guitar> Guitars { get; set; }
    public DbSet<Amplifier> Amplifiers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

}

2 个答案:

答案 0 :(得分:1)

您可能希望使用“public virtual ICollection”而不是“public List”。但是,你写的内容看起来不错。

public virtual ICollection<Guitar> Guitars{ get; set; }

使用“公共虚拟ICollection”的原因是获得延迟加载支持。来自吉他手,摇滚乐!

答案 1 :(得分:1)

您设置POCO的方式似乎没问题。 Code First将自行完成FK技巧。 将您的List<T>设置为虚拟,以便EF可以使用Lazy Loading

如果您确实要设置,请在DAL使用Fluent API:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Entity<Guitarist>().HasRequired(p => p.Guitar).WithMany(b => b.Amplifier)
}

好主意,顺便说一句!