【问题标题】:ASP.Net MVC C# model with multiple instances of another model?具有另一个模型的多个实例的 ASP.Net MVC C# 模型?
【发布时间】:2017-09-20 15:57:37
【问题描述】:

我正在尝试实现这样的系统:工程师可以提出请求,支持人员可以将请求分配给他/她自己,这样当有人尝试在网站上显示请求时,它将显示创建请求的人的姓名和请求分配给的人的姓名。

我的模型:

public class ConfigurationRequest
{
public virtual int     RequestId { get; set; }
public virtual int     UserId { get; set; }
public virtual int     RequestNumber { get; set; }
public virtual string  ReqDesc { get; set; }
}

public class User
{
public virtual int     UserId { get; set; }
public virtual string  UserRole {get; set; }
public virtual string  UserName {get; set; }
public virtual ICollection(ConfigurationRequest) ConfigurationReuquest { get; set; }
}

对于每个配置请求,我想在我的浏览器中显示如下内容:

请求编号:2864965

由(所有者)抚养:戴夫·约翰逊

目前分配给:Mike Clarke

请求说明:燃油平衡系统所需的新点

【问题讨论】:

  • 真正的问题是什么?
  • 这些是你的实体模型,你现在需要的是一个视图模型,它包含两个实体模型的属性(有些人称之为视图模型)。
  • 问题是配置模型必须从同一个表中引用 2 个不同的用户,我需要能够分辨出哪个用户提出了请求以及请求分配给了哪个用户。你明白吗?

标签: c# asp.net models


【解决方案1】:

当引用同一个类两次时,您需要帮助实体框架找出如何匹配 FK。您可以使用注释或流畅的代码。

public class ConfigurationRequest
{
    public int RequestId { get; set; }
    public int RequestNumber { get; set; }
    public string ReqDesc { get; set; }
    // EF will pair the below FK to nav by convention. You could also use ForeignKey attribute.
    public int RequestingUserId { get; set; }
    public User RequestingUser { get; set; }
    public int AssignedUserId { get; set; }  // make this int? if it is optional
    public User AssignedUser { get; set; }
}

public class User
{
    public int UserId { get; set; }
    public string UserRole {get; set; }
    public string UserName {get; set; }

    // you need a collection for each relationship. InverseProperty tells EF how to match them to User FK
    [InverseProperty("RequestingUser")]    
    public virtual ICollection<ConfigurationRequest> RequestsRaised { get; set; }
    [InverseProperty("AssignedUser")]    
    public virtual ICollection<ConfigurationRequest> RequestsAssigned { get; set; }
}

或流利的等价物:

modelBuilder.Entity<ConfigurationRequest>()
  .HasRequired(c => c.RequestingUser)   // or HasOptional()
  .WithMany(p => p.RequestsRaised);

modelBuilder.Entity<ConfigurationRequest>()
  .HasRequired(l => l.AssignedUser)
  .WithMany(p => p.RequestsAssigned);

请参阅here 了解更多信息。另外,不要在非导航属性上使用virtual - 这些不是延迟加载的。

现在您可以在控制器中获取请求,使用它来填充视图模型并显示结果:

context.ConfigurationRequests
       .Include(c => c.RequestingUser)
       .Include(c => c.AssignedUser)
       .FirstOrDefault(c => c.RequestId == myRequestId);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多