在Entity Framework中存储相同类型的多个外键,但只有一个需要外键

时间:2017-05-06 15:48:44

标签: asp.net-mvc entity-framework

在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;} 
          ...
     }

非常感谢任何帮助。我已经被困在试图找到正确的方法来做几天。

感谢。

1 个答案:

答案 0 :(得分:1)

  

我不希望任何关于它的页面存储在Container类中   是的。

这只是OO建模和关系建模之间的区别。在纯OO模型中,您可以拥有类型

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

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();

            }
        }
    }
}

大卫