设置’引发了’System.Data.SqlClient.SqlException’类型的exception
我得到了例外,无法弄明白。
Settings =’((BandwidthRestriction.Models.SettingRespository)settingRespository).Settings’引发了类型’System.Data.SqlClient.SqlException’的exception
我有两张桌子。
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; } } }
和
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 Settings { get; set; } public virtual ICollection Facilities { get; set; } } }
另一张表
namespace BandwidthRestriction.Models { [Table("Facilities")] public class Facility { [Key] public int Id { get; set; } public string Name { get; set; } public ICollection FacilitySettingOverrides { get; set; } } }
桌子的结构很喜欢
[![12] [1] [1]
我也有对应的dbcontext
public class SettingDbContext : DbContext { public DbSet Settings { get; set; } public DbSet 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) { } }
在存储库中,我有
namespace BandwidthRestriction.Models { public class SettingRespository : ISettingRespository { public List GetAllSettings() { return Settings.ToList(); } public IEnumerable Settings { get { List settingList; using (SettingDbContext context = new SettingDbContext()) { settingList = context.Settings.ToList(); } return settingList; } }
在控制器中,我通过了DI。
[Route("api/[controller]")] public class BandwidthController : Controller { private readonly ISettingRespository _settingRespository; public BandwidthController(ISettingRespository settingRespository) { _settingRespository = settingRespository; }
但是,当我hover_settingRespository
。 我看到了例外情况:
Settings =’((BandwidthRestriction.Models.SettingRespository)settingRespository).Settings’引发了类型’System.InvalidOperationException’的exception
编辑:
根据评论,我修复了表名拼写错误问题。 错误是SqlException: Invalid column name 'FacilitySettingOverrideSettingId'
,但我在stackoverflow上发现了类似的问题。 也许我错误地使用了代码?
换句话说,表FacilitySettingOverride ,它没有主键。 是原因吗?
编辑-1
每条评论。 我重新设计了数据库。 我认为Setting-FacilitySettingOverride to be 1:1
[![new] [3]] [3]
和
[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; } }
新的错误是
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("Facilities")] public class Facility { [Key] public int Id { get; set; } public string Name { get; set; } }
我可以在上下文中获取Setting
但是FacilitySettingOverride
。
首先在EF 7代码中创建POCO类
基本上他们是同一个问题。 关键问题是创建正确的POCO类。