设置'抛出一个异常类型'System.Data.SqlClient.SqlException' [英] Settings' threw an exception of type 'System.Data.SqlClient.SqlException'

查看:130
本文介绍了设置'抛出一个异常类型'System.Data.SqlClient.SqlException'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有异常,无法弄清楚。


Settings ='((BandwidthRestriction.Models.SettingRespository)settingRespository)我们有两个表。

 命名空间BandwidthRestriction.Models 
{
[表(设置)]
public class设置
{
[Key]
public int Id {get;组; }
public string Name {get;组; }
public string描述{get;组; }
public string DefaultValue {get;组; }
public string Classification {get;组; }
public virtual FacilitySettingOverride FacilitySettingOverride {get;组; }
}
}

 命名空间BandwidthRestriction.Models 
{
[Table(FacilitySettingOverride)]
public class FacilitySettingOverride
{
[Key]
public int FacilityId {get;组; }
public int SettingId {get;组; }
public string Value {get;组; }
public virtual ICollection< Setting>设置{get;组; }
public virtual ICollection< Facility>设施{get;组; }
}
}

另一个表

 命名空间BandwidthRestriction.Models 
{
[表(设施)]
public class Facility
{
[Key]
public int Id {get;组; }
public string Name {get;组; }
public ICollection< FacilitySettingOverride> FacilitySettingOverrides {get;组; }
}
}

表的结构喜欢



[![12] [1]] [1]



另外我有对应的dbcontext作为

  public class SettingDbContext:DbContext 
{
public DbSet< Setting>设置{get;组; }
public DbSet< FacilitySettingOverride> FacilitySettingOverride {get;组;

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(Data Source = 11.53.63.94; Initial Catalog = AAA; User ID = sa; password =密码;申请名称= XXX);
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{

}
}

在呼吁中,我有

 命名空间BandwidthRestriction.Models 
{
public class SettingRespository:ISettingRespository
{
public List< Setting> GetAllSettings()
{
return Settings.ToList();
}

public IEnumerable< Setting>设置
{
get
{
列表<设置> settingList;
using(SettingDbContext context = new SettingDbContext())
{
settingList = context.Settings.ToList();
}
return settingList;
}
}

在控制器中,我通过了DI。 p>

  [Route(api / [controller])] 
public class BandwidthController:Controller
{
private readonly ISettingRespository _settingRespository;

public BandwidthController(ISettingRespository settingRespository)
{
_settingRespository = settingRespository;
}

但是,当我悬停 _settingRespository 。我看到例外:


Settings ='((BandwidthRestriction.Models.SettingRespository)settingRespository).Settings'抛出一个类型'System .InvalidOperationException'


编辑:



根据评论,我修复了表名拼写错误的问题。错误是 SqlException:无效的列名称FacilitySettingOverrideSettingId,但是我发现一个类似的问题在 stackoverflow。也许我先错了代码?



在另一个字,表 FacilitySettingOverride ,它没有主键。是原因吗?



EDIT-1



我重新设计了数据库。我认为 Setting-FacilitySettingOverride为1:1
[![new] [3]] [3]



  [表(FacilitySettingOverride)] 
public class FacilitySettingOverride
{
[Key]
public int FacilityId {get;组; }

public string Value {get;组; }
public int SettingId {get;组; }

public virtual Facility Facility {get;组; }
public virtual设置设置{get;组;
}

新错误是


SqlException:无效的列名称FacilityId1。


在代码中:


  public int GetFacilityBandwidthSetting(int facilityId)
{
using(SettingDbContext context = new SettingDbContext())
{
var setting = context.Settings.Single(s => s.Name == SettingType.TotalBandwidth.ToString());
var value = context.FacilitySettingOverride.SingleOrDefault(x => x.FacilityId == facilityId
&& x.SettingId == setting.Id);
if(value == null)
return int.Parse(setting.DefaultValue);
return int.Parse(value.Value);
}
}

  [Table(facility)] 
public class Facility
{
[Key]
public int Id {get ;组; }
public string Name {get;组;
}

我可以获得设置 FacilitySettingOverride 在上下文中。

解决方案

首先在EF 7代码中创建POCO课程



基本上他们是同样的问题。关键问题是创建正确的POCO类。


I got the exception and can't figure it out.

Settings = '((BandwidthRestriction.Models.SettingRespository)settingRespository).Settings' threw an exception of type 'System.Data.SqlClient.SqlException'

I have two tables.

namespace BandwidthRestriction.Models
{
    [Table("Settings")]
    public class Setting
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string DefaultValue { get; set; }
        public string Classification { get; set; }
        public virtual FacilitySettingOverride FacilitySettingOverride { get; set; }
    }
}

And

namespace BandwidthRestriction.Models
{
    [Table("FacilitySettingOverride")]
    public class FacilitySettingOverride
    {
        [Key]
        public int FacilityId { get; set; }
        public int SettingId { get; set; }
        public string Value { get; set; }
        public virtual ICollection<Setting> Settings { get; set; }
        public virtual ICollection<Facility> Facilities { get; set; }
    }
}

Another table

namespace BandwidthRestriction.Models
{
    [Table("Facilities")]
    public class Facility
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<FacilitySettingOverride> FacilitySettingOverrides { get; set; }
    }
}

The table's structure likes

[![12][1]][1]

Also I have the correspond dbcontext as

 public class SettingDbContext : DbContext
{
    public DbSet<Setting> Settings { get; set; }
    public DbSet<FacilitySettingOverride> FacilitySettingOverride { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Data Source=11.53.63.94;Initial Catalog=AAA;User ID=sa;password=password;Application Name=XXX");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

    }
}

In the respository, I have

namespace BandwidthRestriction.Models
{
    public class SettingRespository : ISettingRespository
    {
       public List<Setting> GetAllSettings()
       {
          return Settings.ToList();
       }

       public IEnumerable<Setting> Settings
       {
           get
           {
               List<Setting> settingList;
               using (SettingDbContext context = new SettingDbContext())
               {
                   settingList = context.Settings.ToList();
               }
               return settingList;
           }
        }

In the controller, I passed the DI.

 [Route("api/[controller]")]
 public class BandwidthController : Controller
 {
     private readonly ISettingRespository _settingRespository;

     public BandwidthController(ISettingRespository settingRespository)
     {
         _settingRespository = settingRespository;
     }

However when I hover the _settingRespository. I see the exception:

Settings = '((BandwidthRestriction.Models.SettingRespository)settingRespository).Settings' threw an exception of type 'System.InvalidOperationException'

EDIT:

Per the comment, I fixed the table name misspelling issue. The error is SqlException: Invalid column name 'FacilitySettingOverrideSettingId', But I found a similar question at stackoverflow. Maybe I used code first wrongly?

In another word, the table FacilitySettingOverride, it doesn't have the primary key. Is it the cause?

EDIT-1

Per comments. I redesigned the DB. I think that Setting-FacilitySettingOverride to be 1:1 [![new][3]][3]

And

 [Table("FacilitySettingOverride")]
 public class FacilitySettingOverride
 {
    [Key]
    public int FacilityId { get; set; }

    public string Value { get; set; }
    public int SettingId { get; set; }

    public virtual Facility Facility { get; set; }
    public virtual Setting Setting { get; set; }
}

The new error is

SqlException: Invalid column name 'FacilityId1'.

in the code:

    public int GetFacilityBandwidthSetting(int facilityId)
    {
        using (SettingDbContext context = new SettingDbContext())
        {
            var setting = context.Settings.Single(s => s.Name == SettingType.TotalBandwidth.ToString());
            var value = context.FacilitySettingOverride.SingleOrDefault(x => x.FacilityId == facilityId
                && x.SettingId == setting.Id);
            if (value == null)
                return int.Parse(setting.DefaultValue);
            return int.Parse(value.Value);
        }
    }

and

 [Table("Facilities")]
 public class Facility
 {
     [Key]
     public int Id { get; set; }
     public string Name { get; set; }
 }

I can getting Setting but FacilitySettingOverride in the context.

解决方案

Create POCO class in EF 7 code first

Basically they are same question. The key issue is to create the correct POCO class.

这篇关于设置'抛出一个异常类型'System.Data.SqlClient.SqlException'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆