大家好,我尝试更新本地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.
我试图用Google搜索它,但只找到相关的密钥,而我不这样。
有谁能帮助我,我有点无奈。
谢谢。
答案 0 :(得分:1)
这是由于外键约束而发生的。您必须先删除所有引用的子记录,然后再删除父记录。
尝试根据您的业务逻辑修改以下代码,然后让EF处理。
modelBuilder.Entity<Parent>()
.HasMany<Child>(c => c.Children)
.WithOptional(x => x.Parent)
.WillCascadeOnDelete(true);
如果不确定如何建立关系,请使用SQL Server观察表并检查键和约束,如下所示:
答案 1 :(得分:0)
从DbSet的MSDN页面上删除: “将给定的实体标记为Deleted,以便在调用SaveChanges时将其从数据库中删除。请注意,在调用此方法之前,该实体必须以其他某种状态存在于上下文中。”
https://msdn.microsoft.com/en-us/library/system.data.entity.dbset.remove(v=vs.113).aspx
您可以尝试添加:
db.SaveChanges();
在通话中
db.Weathers.Remove(bye);