【问题标题】:Double foreign key dilemma with Identity身份的双重外键困境
【发布时间】:2015-05-23 11:02:34
【问题描述】:

我有一个 ASP.NET MVC 项目,并且正在为我的用户使用身份框架。

项目涉及CustomersAgents,只是普通身份用户的不同角色。

名为Orders 的表既属于Customer,也属于Agent

public class Order
{
    [ForeignKey("User")]
    public int CustomerID { get; set; }
    public virtual List<ApplicationUser> Customer { get; set; }

    [ForeignKey("User")]
    public int AgentID { get; set; }
    public virtual List<ApplicationUser> Agent { get; set; }
}

但是在使用add-migration 时,此模型定义将不起作用并产生错误的 SQL。

首先使用代码完成此任务的最佳方法是什么?我应该明确定义外键,还是创建连接表以避免 2 个外键引用 IdentityUser 表会更好?

【问题讨论】:

  • 您的身份数据库是否与 Order 表所在的位置不同?我相信这是与 Applicationuser 到 Order 的一对多关系,因此外键将在 Applicatoinuser 中。在您的班级中发布 ApplicationUser 模型!
  • 一切都在同一个数据库中。我没有覆盖 ApplucationUser 模型中的任何内容 - 它是 Identity 的默认类。
  • 这就是实体框架如何知道哪个最终属性与哪个集合连接的问题。只需尝试在 ApplicationUser 中添加导航属性。然后运行迁移。
  • 嗯,我需要保存订单、客户和代理之间的关联。我应该将其保存在 ID 中并跳过外键关联吗?这似乎不是一种“干净”的方式,但它可能会奏效。
  • 嗯,这就是关系数据库的工作方式。如果要在实体之间创建关联,则需要定义外键并为实体添加约束。我不明白你为什么称这种方法“不干净”!

标签: c# asp.net-mvc entity-framework ef-code-first asp.net-identity


【解决方案1】:

我用 Order 的这个类定义解决了这个问题:

public class Order
{
    public int OrderID { get; set; }

    public virtual ApplicationUser Customer { get; set; }
    public virtual ApplicationUser Agent { get; set; }

}

Entity 用这个正确地解决了剩下的问题。

【讨论】:

    【解决方案2】:

    一个订单只能属于一个客户和一个代理,因此不需要为客户和代理使用收集。而是

     public class Order
    {
        [ForeignKey("Customer")]
        public int CustomerID { get; set; }
        public virtual ApplicationUser Customer { get; set; }
    
        [ForeignKey("Agent")]
        public int AgentID { get; set; }
        public virtual ApplicationUser Agent { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-08
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      相关资源
      最近更新 更多