C # не может удалить объект из DbContext - PullRequest
0 голосов
/ 13 сентября 2018

Привет всем, я пытаюсь обновить свой локальный sqldb безуспешно.
Я создал DbContext:

    public class DbContextWeather1 : DbContext
    {
        public DbSet<WeatherRoot> Weathers { get; set; }
}

Где WeatherRoot:

public class Coord
{
    [JsonProperty("lon")]
    public double Longitude { get; set; } 

    [JsonProperty("lat")]
    public double Latitude { get; set; } 
}

public class Sys
{

    [JsonProperty("country")]
    public string Country { get; set; } 
}

public class Weather
{
    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("main")]
    public string Main { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; } 

    [JsonProperty("icon")]
    public string Icon { get; set; }


}

public class Main
{
    [JsonProperty("temp")]
    public double Temperature { get; set; } 
    [JsonProperty("pressure")]
    public double Pressure { get; set; } 

    [JsonProperty("humidity")]
    public double Humidity { get; set; } 
    [JsonProperty("temp_min")]
    public double MinTemperature { get; set; } 

    [JsonProperty("temp_max")]
    public double MaxTemperature { get; set; } 
}

public class Wind
{
    [JsonProperty("speed")]
    public double Speed { get; set; } 

    [JsonProperty("deg")]
    public double WindDirectionDegrees { get; set; } 

}

public class Clouds
{

    [JsonProperty("all")]
    public int CloudinessPercent { get; set; } 
}

public class WeatherRoot
{
    [JsonProperty("coord")]
    public Coord Coordinates { get; set; }

    [JsonProperty("sys")]
    public Sys System { get; set; } 

    [JsonProperty("weather")]
    public List<Weather> Weather { get; set; } 

    [JsonProperty("main")]
    public Main MainWeather { get; set; } 

    [JsonProperty("wind")]
    public Wind Wind { get; set; } 

    [JsonProperty("clouds")]
    public Clouds Clouds { get; set; } 

    [JsonProperty("id")]
    public int CityId { get; set; } 

    [JsonProperty("name")]
    [Key]
    public string Name { get; set; } 

    [JsonProperty("dt_txt")]
    public string Date { get; set; } 

    [JsonIgnore]
    public string DisplayDate => DateTime.Parse(Date).Hour.ToString();
    [JsonIgnore]

    public string DisplayTemp => $"{MainWeather?.Temperature ?? 0}° 
    {Weather?[0]?.Main ?? string.Empty}";

    [JsonIgnore]
    public string DisplayIcon => $"http://openweathermap.org/img/w/{Weather? 
    [0]?.Icon}.png";
    [JsonIgnore]
    public string Icon => Weather?[0]?.Icon;
    //[JsonIgnore]
    //public string DisplayDescription => $"{Weather?[0]?.Description}";
}

Но когда япытаюсь удалить конкретный объект:

  public void SaveWeather(WeatherRoot weather)
        {

        using (var db = new DbContextWeather1())
        {
            db.Database.CreateIfNotExists();
            //var tmp = db.Weathers;
            if (db.Weathers.Any(W => W.Name.Equals(weather.Name)))
            {
                var bye = (from x in db.Weathers
                           where x.Name.Equals(weather.Name)
                           select x).FirstOrDefault();

                db.Weathers.Remove(bye);

                db.Entry(bye).State = System.Data.Entity.EntityState.Deleted;

            }
            var w = new WeatherRoot()
            {
                CityId = weather.CityId,
                Clouds = weather.Clouds,
                Coordinates = weather.Coordinates,
                Date = weather.Date,
                MainWeather = weather.MainWeather,
                Name = weather.Name,
                System = weather.System,
                Weather = weather.Weather,
                Wind = weather.Wind
            };
            if (w.Date == null)
            {
                w.Date = DateTime.Now.ToString();
            }
            db.Weathers.Add(w);
            db.SaveChanges();


        }
    }

Я получаю эту ошибку:

The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.Weathers_dbo.WeatherRoots_WeatherRoot_Name". The conflict occurred in database "WeatherApp.DataProtocol.DbContextWeather1", table "dbo.Weathers", column 'WeatherRoot_Name'.
The statement has been terminated.

Я пытался гуглить, но нашел только связанные ключи, что не в моем случае.
Кто-нибудь может мне помочь с этим, я вроде беспомощен.
Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Это происходит из-за ограничения внешнего ключа.Вы должны удалить все ссылочные дочерние записи перед удалением родительской записи.

Попробуйте применить следующий код после изменения его в соответствии с вашей бизнес-логикой и позвольте EF справиться с этим.

                 modelBuilder.Entity<Parent>()
                .HasMany<Child>(c => c.Children)
                .WithOptional(x => x.Parent)
                .WillCascadeOnDelete(true);

Если вы не уверены в том, как создаются отношения, просмотрите таблицы, использующие SQL Server, и изучите ключи и ограничения следующим образом

enter image description here

0 голосов
/ 13 сентября 2018

Со страницы MSDN на DbSet.Remove: «Помечает данную сущность как удаленную, так что она будет удалена из базы данных при вызове SaveChanges. Обратите внимание, что сущность должна существовать в контексте в каком-то другом состоянии, прежде чем вызывается этот метод.»

https://msdn.microsoft.com/en-us/library/system.data.entity.dbset.remove(v=vs.113).aspx

Вы можете попробовать добавить:

db.SaveChanges();

по вашему звонку:

db.Weathers.Remove(bye);
...