0

我正在开发一个多层 ASP.NET MVC Web 应用程序,但由于无法在我的应用程序中检索数据的准确对象表示,因此无法取得进一步进展。为什么会这样?我试图尽可能详细,但如果您想了解更多信息,请要求澄清。我的项目如下:


-MyProject.Data
-MyProject.Logic
-MyProject.Objects
-MyProject.Web



MyProject.Objects.Entities中的我的实体类

public class Report
{
    [Key]
    public int Id { get; set; }
    public string ReportName { get; set; }
    public int ProductId { get; set; }
}

public class Product
{
    [Key]
    public int Id { get; set; }
    public string ProductName { get; set; }
    public ICollection<Report> ProductReports { get; set; }
}



MyProject.Data中的我的上下文

public class MyDb : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Report> Reports { get; set; }
}



我来自MyProject.Web的控制器

 public class HomeController : Controller
{
    MyDb _db = new MyDb();

    public ActionResult Index()
    {
        var model =
            from p in _db.Products
            orderby p.ProductName ascending
            select p;

        return View(model);
    }
}



最后,我的Seed()方法来自MyProject.Data.Migrations.Configuration

protected override void Seed(MyProject.Data.MyDb context)
    {
        context.Products.AddOrUpdate(r => r.ProductName,
                new Product
                {
                    ProductName = "AAA",
                    ProductReports =
                        new List<Report> { 
                            new Report { ReportName = "Report A" },
                            new Report { ReportName = "Report B" },
                            new Report { ReportName = "Report C" }
                            }
                },
                new Product
                {
                    ProductName = "MSI",
                    ProductReports =
                        new List<Report> { 
                            new Report { ReportName = "Report X" },
                            new Report { ReportName = "Report Z" }
                            }
                });
    }




我不知道为什么我无法ICollection<Report> ProductReportsMyProject.Objects.Entities.Product中获取正确的值。这是我Index()MyProject.Web中的结果

在此处输入图像描述



起初,我对这个框架有点陌生,我认为我遇到了一些与数据结构有关的问题。据我所知,我的数据似乎设置正确。这是我在 SQL Server 中的数据

在此处输入图像描述




为了进一步证明数据似乎是正确的,我运行了以下查询以确保关系设置正确。我将在查询旁边提供结果。

SELECT * From Reports INNER JOIN Products ON Reports.ProductId = Products.Id


在此处输入图像描述

4

3 回答 3

1

它会是这样的:

public class ReportMap : EntityTypeConfiguration<Report>
    {
        public ReportMap()
        {
            // Primary Key
            this.HasKey(t => t.Id);

            // Properties
            this.Property(t => t.ReportName)
                .IsRequired()
                .HasMaxLength(100);

            // Table & Column Mappings
            this.ToTable("Reports");
            this.Property(t => t.Id).HasColumnName("Id");
            this.Property(t => t.ReportName).HasColumnName("ReportName");

            // Relationships
            this.HasRequired(t => t.Product)
                .WithMany(t => t.ProductReports)
                .HasForeignKey(d => d.ProductId);
        }
    }

并将您的报告更改为也具有 Product 属性,如下所示:

public class Report
{
    [Key]
    public int Id { get; set; }
    public string ReportName { get; set; }
    public int ProductId { get; set; }
    public virtual Product Product { get; set; }
}

然后在您的上下文中:

public partial class SomeContext : DbContext
{
    static SomeContext()
    {
        Database.SetInitializer<SomeContext>(null);
    }

    public SomeContext()
        : base("Name=SomeContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new ReportMap());
    }
}
于 2013-09-13T18:07:45.260 回答
1

如前所述,您似乎缺少映射:

public class Product
{
  [Key]
  public int ProductID { get; set; }
  public string ProductName { get; set; }
  public virtual ICollection<Report> ProductReports { get; set; }
}

public class Report
{
  [Key]
  public int ReportID { get; set; }
  public string ReportName { get; set; }
  public int ProductID { get; set; }
  public virtual Product Product { get; set; }
}

两个表中的映射字段名称必须相同,映射将使用 EF 自动为您完成。您还可以向报告添加一个虚拟属性,以便在报告中您可以调用 Product.ProductName 或其他任何内容。

希望这可以帮助

于 2013-09-13T18:13:45.470 回答
1

这是我工作的 EF 关系示例:

public class CourseSection
{
    [Key]
    public int CourseSectionID { get; set; }

    public int CourseID { get; set; }

    public string Title { get; set; }

    public virtual ICollection<SectionContent> SectionContents { get; set; }
}

public class Course
{
    [Key]
    public int CourseID { get; set; }

    [StringLength(50)]
    public string Name { get; set; }

    public virtual ICollection<CourseSection> CourseSections { get; set; }
}
于 2013-09-13T18:47:51.553 回答