【问题标题】:MVC how to set Navigation PropertiesMVC 如何设置导航属性
【发布时间】:2017-11-05 10:07:35
【问题描述】:

我在正确设置导航属性时遇到了问题,因为我收到了错误

外键组件 ID 不是管理员类型的声明属性。

我的模型基本上由一个基类User 组成,它有两个派生类AdministratorCommon 用户。我相信这是一对多的关系,因为可以有多个普通用户和管理员用户。

我的课程如下所示:

    [Table("User")]
    public class User
    {
        [Key]
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public DateTime RegisterDate { get; set; }

        public virtual ICollection<Common> CommonUsers { get; set; }
        public virtual ICollection<Administrator> Administrators { get; set;}
    }

    public class Administrator : Usuario
    {
        [ForeignKey("User")]
        public int ID { get; set; }

        public virtual User User { get; set; }
    }

    public class Common : Usuario
    {
        [ForeignKey("User")]
        public int ID { get; set; }

        public virtual User User { get; set; }
    }

我在派生类中的两个 ID 属性上设置了外键,以引用作为表的主键的用户 ID。 任何意见将不胜感激。

【问题讨论】:

  • 我相信这是一对多的关系不,它是继承,你应该从子类中完全删除 ID 属性。
  • @GertArnold 我之前添加了它们,因为我遇到了类似的错误,但现在我可以正确创建脚手架项目。非常非常感谢你。我花了几个小时在这上面:)。你可以把它作为一个答案,我会标记它是正确的。
  • @GertArnold 另外,当我从这个模型创建数据库时,它将如何在数据库中为这个派生类创建一个外键?。
  • 什么的外键?默认情况下,所有类型都将位于一个带有鉴别器列的表中。 (TPH)。

标签: c# asp.net entity-framework


【解决方案1】:

语义上你的构造

public virtual ICollection<Common> CommonUsers { get; set; }
public virtual ICollection<Administrator> Administrators { get; set;}

表示单个user 可以是多个Administrators,并且每个Administrator 可以分配给单个用户。

public virtual User User { get; set; }

从解释的逻辑来看,反之亦然。

public class User
{
    [Key]
    public int ID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public DateTime RegisterDate { get; set; }

    //public virtual ICollection<Common> CommonUsers { get; set; }
    public virtual Administrator Administrators { get; set;}
}

public class Administrator : Usuario
{
    //Primary key is required but not defined
    [ForeignKey("User")]
    public int ID { get; set; }

    //same admin role applies to many users
    public virtual ICollection<User> User { get; set; }
}

另请注意,类名User 可能会与System.Security.Principal.User 产生阴影/冲突

你的意思很可能

public class Usuario // User
{
    [Key]
    public int ID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public DateTime RegisterDate { get; set; }

    //public virtual ICollection<Common> CommonUsers { get; set; }
    //public virtual ICollection<Administrator> Administrators { get; set;}

    //define 1-to-1(0)
    public virtual Common CommonUsers { get; set; }
    public virtual Administrator Administrators { get; set;}
}

public class Administrator : Usuario
{
    [ForeignKey("User")]
    public int ID { get; set; }

    public virtual User User { get; set; }
}

【讨论】:

  • 我明白了,您是否建议我在所有三个类中采用 1 对 1 方法,或者在您上面评论的派生类中采用 1 对 * 方法?。
  • 删除CommonUsers 类并将一些默认设置应用于不是Admin 的用户
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多