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