2017-05-06 57 views
0

在MVC项目中,我有一个Page类和一个Container类。我打算每个人都在数据库中拥有自己的表格,因此每个页面都会有一个可供选择的容器列表。页面可以有多个容器,一个容器可以在多个页面上使用。在实体框架中存储多个相同类型的外键,但只有一个需要外键

我的问题是,我不想在Container类中存储任何关于它所在页面的内容。一个页面包含容器,但是来自Container类的页面被发现是不相关的。

我已经看到这种类型的关系的所有实体框架的例子似乎在这两个类上存储一个外键。

public class Page 
    { 
      public int Id { get; set; } 
      public virtual ICollection<Container> Containers {get;set;} 
      ... 
    } 
    public class Container 
    { 
      public int Id { get; set; } 
      public virtual ICollection<Page> Pages{get;set;} 
      ... 
    } 

任何帮助将不胜感激。我一直在试图找到正确的方法来做这个几天。

谢谢。

+2

这仅仅是一个多到多realtionship这样一个连接表将创建一个将存储外键; – CodeNotFound

回答

1

我不希望将任何内容存储在容器类中,关于它的页面 所在的页面。

这只是OO建模和关系建模之间的区别。在纯面向对象模型,你可以有型

class Foo 
{ 
    List<Bar> Bars = new List<Bar>(); 
} 

,酒吧对象的属性没有对Foo对象的任何知识。但关系模型根本就不能这样工作。关系都是用外键实现的。所以在数据库中需要外键。虽然EF支持拥有一个没有外键属性的实体,但它不鼓励。

但在你的情况下,这是一个多对多的关系。在使用链接表的关系模型中,外键列位于链接表上,而不在实体表上。该实体唯一的一个是导航属性,它不是结构性的,可以省略。您只需告知EF关系的基数,因为在您当前的模型中,关系是根据导航属性按惯例定义的。

因此,像

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Configuration; 
using System.Data.Entity; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ef6test 
{ 
    public class Page 
    { 
     public int Id { get; set; } 
     public virtual ICollection<Container> Containers { get; set; } 

    } 
    public class Container 
    { 
     public int Id { get; set; } 
     // public virtual ICollection<Page> Pages { get; set; } 

    } 

    public class Db : DbContext 
    { 
     public DbSet<Page> Pages { get; set; } 
     public DbSet<Container> Containers { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 

      modelBuilder.Entity<Page>() 
         .HasMany(p => p.Containers) 
         .WithMany(); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      using (var db = new Db()) 
      { 
       db.Database.Create(); 

      } 
     } 
    } 
} 

大卫