Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用MVC 3和实体框架,如何将同一类的不同实例映射到3个不同的集合属性?_Asp.net Mvc_Asp.net Mvc 3_Entity Framework_Entity Framework 4.1 - Fatal编程技术网

Asp.net mvc 使用MVC 3和实体框架,如何将同一类的不同实例映射到3个不同的集合属性?

Asp.net mvc 使用MVC 3和实体框架,如何将同一类的不同实例映射到3个不同的集合属性?,asp.net-mvc,asp.net-mvc-3,entity-framework,entity-framework-4.1,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,Entity Framework 4.1,因此,我创建了以下相关类,并尝试采用代码优先的方法。我希望Quote类通过3个不同的可导航属性名引用User类的3个实例,但是当我使用DBInitializer填充和创建DB时,Quote表有6列,而不是预期的3列,其中3列始终为空。可导航属性指向这3个空列,因此每当我指向Quote.Manager或其他3个属性之一时,它将返回null而不是实际的Manager。我怎样才能解决这个问题 Quote类(我省略了一点,但你明白了): 用户类别: using System; using System.

因此,我创建了以下相关类,并尝试采用代码优先的方法。我希望Quote类通过3个不同的可导航属性名引用User类的3个实例,但是当我使用DBInitializer填充和创建DB时,Quote表有6列,而不是预期的3列,其中3列始终为空。可导航属性指向这3个空列,因此每当我指向Quote.Manager或其他3个属性之一时,它将返回null而不是实际的Manager。我怎样才能解决这个问题

Quote类(我省略了一点,但你明白了):

用户类别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace QuoteManager.Models
{
    public class User
    {

        public User()
        {
            this.Quotes = new HashSet<Quote>();
            this.CreatedQuotes = new HashSet<Quote>();
            this.ManagedQuotes = new HashSet<Quote>();
        }

        public int UserID { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual string Phone { get; set; }
        public virtual string Email { get; set; }

        public virtual ICollection<Quote> Quotes { get; set; }
        public virtual ICollection<Quote> CreatedQuotes { get; set; }
        public virtual ICollection<Quote> ManagedQuotes { get; set; }
        public virtual ICollection<Note> Notes { get; set; }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
命名空间QuoteManager.Models
{
公共类用户
{
公共用户()
{
this.Quotes=new HashSet();
this.CreatedQuotes=new HashSet();
this.ManagedQuotes=new HashSet();
}
public int UserID{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟字符串电话{get;set;}
公共虚拟字符串电子邮件{get;set;}
公共虚拟ICollection引号{get;set;}
公共虚拟ICollection创建了引号{get;set;}
公共虚拟ICollection ManagedQuotes{get;set;}
公共虚拟ICollection注释{get;set;}
}
}

为其他两个属性对将属性[ForeignKey(“Creator”)添加到CreatorID,依此类推。

为其他两个属性对将属性[ForeignKey(“Creator”)添加到CreatorID,依此类推。

使用
InverseProperty
属性指定参与关系的其他属性

public class Quote
{
    public int QuoteID { get; set; }

    public virtual int StateID { get; set; }
    public virtual State State { get; set; }

    public virtual int CreatorID { get; set; }

    [InverseProperty("CreatedQuotes")]
    public virtual User Creator { get; set; }

    public virtual int AgentID { get; set; }
    public virtual User Agent { get; set; }

    public virtual int ManagerID { get; set; }

    [InverseProperty("ManagedQuotes")]
    public virtual User Manager { get; set; }
}

public class User
{
    public User()
    {
        this.Quotes = new HashSet<Quote>();
        this.CreatedQuotes = new HashSet<Quote>();
        this.ManagedQuotes = new HashSet<Quote>();
    }

    public int UserID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Phone { get; set; }
    public virtual string Email { get; set; }

    public virtual ICollection<Quote> Quotes { get; set; }

    [InverseProperty("Creator")]
    public virtual ICollection<Quote> CreatedQuotes { get; set; }

    [InverseProperty("Manager")]
    public virtual ICollection<Quote> ManagedQuotes { get; set; }
    public virtual ICollection<Note> Notes { get; set; }

}
公共类报价
{
公共int QuoteID{get;set;}
公共虚拟int StateID{get;set;}
公共虚拟状态状态{get;set;}
公共虚拟int创建者ID{get;set;}
[反向属性(“CreatedQuotes”)]
公共虚拟用户创建者{get;set;}
公共虚拟内部代理{get;set;}
公共虚拟用户代理{get;set;}
公共虚拟int ManagerID{get;set;}
[InverseProperty(“ManagedQuotes”)]
公共虚拟用户管理器{get;set;}
}
公共类用户
{
公共用户()
{
this.Quotes=new HashSet();
this.CreatedQuotes=new HashSet();
this.ManagedQuotes=new HashSet();
}
public int UserID{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟字符串电话{get;set;}
公共虚拟字符串电子邮件{get;set;}
公共虚拟ICollection引号{get;set;}
[反向财产(“创造者”)]
公共虚拟ICollection创建了引号{get;set;}
[反向财产(“经理”)]
公共虚拟ICollection ManagedQuotes{get;set;}
公共虚拟ICollection注释{get;set;}
}

类似地映射其他关系。

使用
InverseProperty
属性指定参与关系的其他属性

public class Quote
{
    public int QuoteID { get; set; }

    public virtual int StateID { get; set; }
    public virtual State State { get; set; }

    public virtual int CreatorID { get; set; }

    [InverseProperty("CreatedQuotes")]
    public virtual User Creator { get; set; }

    public virtual int AgentID { get; set; }
    public virtual User Agent { get; set; }

    public virtual int ManagerID { get; set; }

    [InverseProperty("ManagedQuotes")]
    public virtual User Manager { get; set; }
}

public class User
{
    public User()
    {
        this.Quotes = new HashSet<Quote>();
        this.CreatedQuotes = new HashSet<Quote>();
        this.ManagedQuotes = new HashSet<Quote>();
    }

    public int UserID { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Phone { get; set; }
    public virtual string Email { get; set; }

    public virtual ICollection<Quote> Quotes { get; set; }

    [InverseProperty("Creator")]
    public virtual ICollection<Quote> CreatedQuotes { get; set; }

    [InverseProperty("Manager")]
    public virtual ICollection<Quote> ManagedQuotes { get; set; }
    public virtual ICollection<Note> Notes { get; set; }

}
公共类报价
{
公共int QuoteID{get;set;}
公共虚拟int StateID{get;set;}
公共虚拟状态状态{get;set;}
公共虚拟int创建者ID{get;set;}
[反向属性(“CreatedQuotes”)]
公共虚拟用户创建者{get;set;}
公共虚拟内部代理{get;set;}
公共虚拟用户代理{get;set;}
公共虚拟int ManagerID{get;set;}
[InverseProperty(“ManagedQuotes”)]
公共虚拟用户管理器{get;set;}
}
公共类用户
{
公共用户()
{
this.Quotes=new HashSet();
this.CreatedQuotes=new HashSet();
this.ManagedQuotes=new HashSet();
}
public int UserID{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟字符串电话{get;set;}
公共虚拟字符串电子邮件{get;set;}
公共虚拟ICollection引号{get;set;}
[反向财产(“创造者”)]
公共虚拟ICollection创建了引号{get;set;}
[反向财产(“经理”)]
公共虚拟ICollection ManagedQuotes{get;set;}
公共虚拟ICollection注释{get;set;}
}

类似地映射其他关系。

最终解决方案

多亏了您对InverseProperty的引用,我发现了一篇精彩的文章,完全涵盖了我希望使用fluent API实现的目标。这篇文章是在一月份写的,但我很确定CTP5现在已经正式成为MVC3和EF核心的一部分

好的…我要记录下我发现的效果很好!我讨厌人们留下部分答案,所以我们开始吧

这里有一点冗余,但它可以工作。我的Quote类如下所示:

    [ForeignKey("Creator")]
    public virtual int CreatorID { get; set; }
    [InverseProperty("CreatedQuotes")]
    public virtual User Creator { get; set; }

    [ForeignKey("Agent")]
    public virtual int AgentID { get; set; }
    [InverseProperty("OwnedQuotes")]
    public virtual User Agent { get; set; }

    [ForeignKey("Manager")]
    public virtual int ManagerID { get; set; }
    [InverseProperty("ManagedQuotes")]
    public virtual User Manager { get; set; }
    public virtual ICollection<Quote> CreatedQuotes { get; set; }
    public virtual ICollection<Quote> OwnedQuotes { get; set; }
    public virtual ICollection<Quote> ManagedQuotes { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Quote>()
            .HasRequired(a => a.Manager)
            .WithMany()
            .HasForeignKey(u => u.ManagerID);

        modelBuilder.Entity<Quote>()
                    .HasRequired(a => a.Agent)
                    .WithMany()
                    .HasForeignKey(u => u.AgentID).WillCascadeOnDelete(false);

        modelBuilder.Entity<Quote>()
                    .HasRequired(a => a.Manager)
                    .WithMany()
                    .HasForeignKey(u => u.ManagerID).WillCascadeOnDelete(false);
    }
然后,我的用户类如下所示:

    [ForeignKey("Creator")]
    public virtual int CreatorID { get; set; }
    [InverseProperty("CreatedQuotes")]
    public virtual User Creator { get; set; }

    [ForeignKey("Agent")]
    public virtual int AgentID { get; set; }
    [InverseProperty("OwnedQuotes")]
    public virtual User Agent { get; set; }

    [ForeignKey("Manager")]
    public virtual int ManagerID { get; set; }
    [InverseProperty("ManagedQuotes")]
    public virtual User Manager { get; set; }
    public virtual ICollection<Quote> CreatedQuotes { get; set; }
    public virtual ICollection<Quote> OwnedQuotes { get; set; }
    public virtual ICollection<Quote> ManagedQuotes { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Quote>()
            .HasRequired(a => a.Manager)
            .WithMany()
            .HasForeignKey(u => u.ManagerID);

        modelBuilder.Entity<Quote>()
                    .HasRequired(a => a.Agent)
                    .WithMany()
                    .HasForeignKey(u => u.AgentID).WillCascadeOnDelete(false);

        modelBuilder.Entity<Quote>()
                    .HasRequired(a => a.Manager)
                    .WithMany()
                    .HasForeignKey(u => u.ManagerID).WillCascadeOnDelete(false);
    }
公共虚拟ICollection创建了引号{get;set;}
公共虚拟ICollection OwnedQuotes{get;set;}
公共虚拟ICollection ManagedQuotes{get;set;}
最后,我的DBContext类如下所示:

    [ForeignKey("Creator")]
    public virtual int CreatorID { get; set; }
    [InverseProperty("CreatedQuotes")]
    public virtual User Creator { get; set; }

    [ForeignKey("Agent")]
    public virtual int AgentID { get; set; }
    [InverseProperty("OwnedQuotes")]
    public virtual User Agent { get; set; }

    [ForeignKey("Manager")]
    public virtual int ManagerID { get; set; }
    [InverseProperty("ManagedQuotes")]
    public virtual User Manager { get; set; }
    public virtual ICollection<Quote> CreatedQuotes { get; set; }
    public virtual ICollection<Quote> OwnedQuotes { get; set; }
    public virtual ICollection<Quote> ManagedQuotes { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<Quote>()
            .HasRequired(a => a.Manager)
            .WithMany()
            .HasForeignKey(u => u.ManagerID);

        modelBuilder.Entity<Quote>()
                    .HasRequired(a => a.Agent)
                    .WithMany()
                    .HasForeignKey(u => u.AgentID).WillCascadeOnDelete(false);

        modelBuilder.Entity<Quote>()
                    .HasRequired(a => a.Manager)
                    .WithMany()
                    .HasForeignKey(u => u.ManagerID).WillCascadeOnDelete(false);
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Entity()
.HasRequired(a=>a.Manager)
.有很多
.HasForeignKey(u=>u.ManagerID);
modelBuilder.Entity()
.HasRequired(a=>a.Agent)
.有很多
.HasForeignKey(u=>u.AgentID).WillCascadeOnDelete(false);
modelBuilder.Entity()
.HasRequired(a=>a.Manager)
.有很多
.HasForeignKey(u=>u.ManagerID).WillCascadeOnDelete(false);
}
你可以