2016-05-20 9 views
3

Я получил исключение и не могу понять это.Настройки «выбрасывают исключение типа« System.Data.SqlClient.SqlException »

Настройки = '((BandwidthRestriction.Models.SettingRespository) settingRespository) .settings' сгенерировала исключение типа 'System.Data.SqlClient.SqlException'

У меня есть две таблицы.

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<Setting> Settings { get; set; } 
     public virtual ICollection<Facility> Facilities { get; set; } 
    } 
} 

Другая таблица

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; } 
    } 
} 

структуры таблицы любит

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

Также я соответствуют dbcontext как

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) 
    { 

    } 
} 

В respository, у меня

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; 
      } 
     } 

В контроллере я прошел DI.

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

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

Однако, когда я наматываю _settingRespository. Я вижу исключение:

Настройки = '((BandwidthRestriction.Models.SettingRespository) settingRespository) .settings' бросил исключение типа '' System.InvalidOperationException

EDIT:

В комментарии я исправил проблему с орфографической ошибкой. Ошибка SqlException: Invalid column name 'FacilitySettingOverrideSettingId', но я нашел аналогичный вопрос на stackoverflow. Возможно, я использовал код сначала неправильно?

В другом слове, таблице FacilitySettingOverride, он не имеет первичного ключа. Это причина?

EDIT-1

Per комментарии. Я переработал БД. Я думаю, что Setting-FacilitySettingOverride to be 1:1 [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 [[новый] [3]]: Недопустимое имя столбца '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 в контексте.

+0

Есть ли внутреннее исключение? – tofutim

+0

@tofutim. Нет внутреннего исключения. Просто красный X. Исключение подразумевалось 'get { Список settingList; using (SettingDbContext context = new SettingDbContext()) { 10 setList = context.Settings.ToList(); } return settingList; } '- это местоположение ошибки –

+0

- таблица настроек в дБ? – tofutim

ответ

Смежные вопросы