【问题标题】:What is wrong, System.Data.SqlClient.SqlException: Invalid column name 'tbl_rules_rulID'.?怎么了,System.Data.SqlClient.SqlException:无效的列名'tbl_rules_rulID'。?
【发布时间】:2017-08-12 19:45:09
【问题描述】:

我有两个相关的表,以及自动生成的带视图的控制器。 当我打开索引,所有记录列表时出现此错误:

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详情: System.Data.SqlClient.SqlException:列名“tbl_rules_rulID”无效。

这里是模型 tbl_rules

public class tbl_rules
    {
     public tbl_rules()
        {
            tbl_users = new HashSet<tbl_users>();
        }

        [Key]
        [DisplayName("ID")]
        public int rulID { get; set; }
        [Required(ErrorMessage = "Изберете Овластување")]
        [DisplayName("Овластување")]
        public string Rule_Name { get; set; }
        public virtual ICollection<tbl_users> tbl_users { get; set; }
    }

这里是模型 tbl_users:

public class tbl_users
{
    [Key]
    [DisplayName("ID")]
    public int uID { get; set; }
    [Required(ErrorMessage = "Ве молиме внесете име на Агентот")]
    [StringLength(50)]
    [DisplayName("Агент")]
    [MaxLength(20, ErrorMessage = "Максимален број на карактери за {0} 20")]
    public string user_ime { get; set; }
    [Required(ErrorMessage = "Ве молиме внесете Username")]
    [StringLength(50)]
    [DisplayName("Username")]
    public string username { get; set; }
    [Required(ErrorMessage = "Ве молиме внесете Password")]
    [StringLength(50)]
    [DataType(DataType.Password)]
    [DisplayName("Password")]
    public string Password { get; set; }
    [Required(ErrorMessage = "Ве молиме внесете телефонски број")]
    [StringLength(50)]
    [DisplayName("Телефон")]
    public string tel { get; set; }
    [Required(ErrorMessage = "Ве молиме внесете Белешка.")]
    [StringLength(50)]
    [DisplayName("Белешка")]
    public string note { get; set; }
    [DisplayName("Активен?")]
    public bool active { get; set; }
    [DisplayName("Статус")]
    public bool IsOnline { get; set; }
    [DisplayName("Овластување")]
    [Required(ErrorMessage = "Изберете Овластување")]
    public int rullID { get; set; }
    private DateTime? modified1;
    public DateTime modified
    {
        get { return modified1 ?? DateTime.Now; }
        set { modified1 = value; }
    }
    public virtual tbl_rules tbl_rules { get; set; }
}

控制器代码:

  public ActionResult Index()
        {
            return View(db.tbl_users.ToList());
        }

tbl_rules SQL:

CREATE TABLE [dbo].[tbl_rules] (
    [rulID]     INT            IDENTITY (1, 1) NOT NULL,
    [Rule_Name] NVARCHAR (MAX) NOT NULL,
    PRIMARY KEY CLUSTERED ([rulID] ASC)
);

tbl_users SQL:

CREATE TABLE [dbo].[tbl_users] (
    [uID]      INT           IDENTITY (1, 1) NOT NULL,
    [user_ime] NVARCHAR (50) NOT NULL,
    [username] NVARCHAR (50) NOT NULL,
    [Password] NVARCHAR (50) NOT NULL,
    [tel]      NVARCHAR (50) NOT NULL,
    [note]     NVARCHAR (50) NOT NULL,
    [active]   BIT           NOT NULL,
    [rullID]   INT           NOT NULL,
    [modified] DATETIME      DEFAULT (getdate()) NOT NULL,
    [IsOnline] BIT           NOT NULL,
    PRIMARY KEY CLUSTERED ([uID] ASC),
    CONSTRAINT [UserName] UNIQUE NONCLUSTERED ([username] ASC),
    CONSTRAINT [ZaRules] FOREIGN KEY ([rullID]) REFERENCES [dbo].[tbl_rules] ([rulID])
);

这里有什么问题?

【问题讨论】:

  • 不要发布你的代码截图。发布 SQL 表的代码定义。更重要的是:发布完整的异常消息和堆栈跟踪!
  • 谢谢,更新
  • tbl_users 中的导航属性不遵循约定,规则 id 字段在表之间命名不同。您必须手动映射它或更改数据库以遵循 EF 约定。

标签: c# entity-framework asp.net-mvc-4


【解决方案1】:

EF 无法正确映射关系。 您可以在用户类中重命名您的 FK

public int rulID { get; set; }

而不是

public int rullID { get; set; }

或者你可以添加注解:

    [ForeignKey("rullID ")]
    public virtual tbl_rules tbl_rules { get; set; }

这两种方法都可以解决你的问题。

【讨论】:

  • 谢谢,第二个解决方案对我来说更好,而且很有效。谢谢
【解决方案2】:

我猜这两个应该是一样的?
来自规则:

public int rulID { get; set; }

来自用户:

public int rullID { get; set; }

确实,您的rules 表没有rullID 列,正如您的错误消息清楚地告诉您的那样。

只需调用RuleId 列即可避免这些难以看到的错字。保存一个角色不值得麻烦。

明确一点:您显示的错误消息可能来自您尚未发布的代码。您在某处指的是tbl_rules_rulID,而该列确实不存在。因此,要么修复引用,要么创建该列。

【讨论】:

  • 在tbl_rules中主键名是rulID,但是在tbl_users中列名是rullID,我觉得没问题,因为FK也是在数据库关系中创建的属性。
  • 出现错误是不行的。只要把事情理顺就好。这是一个好习惯,它可能有助于避免维护您的代码的人试图伤害您;)您的错误消息清楚地表明您在某处指的是规则:rullID,一个显然不存在的列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2019-11-02
  • 2016-04-22
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多