我有这种结构。
Question ---< Answer
-------- ------
Id Id
Text Value
我尝试通过Id
从DbContext
设置值到新的值然后调用SaveChanges
来更新Answer的值。
这是失败的说明需要提问。我在虚拟Answer
上有导航属性。
出于某种原因,EF认为我希望问题为空。如果我设置一个断点并延迟加载问题,那么一切正常。
我只想更新价值,我是否需要急切加载问题? 如果是这样,这对我来说似乎很奇怪。
答案实体中的问题有[Required]
数据注释似乎导致问题。
答案 0 :(得分:2)
是的,那是怎么回事。如果导航属性不可为空,则在加载之前保存将失败。你有两个解决方案:
/*
* Get cities based on city name and radius in KM
*/
// get geocode object as array from The Google Maps Geocoding API
$geocodeObject = json_decode(file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address={CITY NAME},{COUNTRY CODE}'), true);
// get latitude and longitude from geocode object
$latitude = $geocodeObject['results'][0]['geometry']['location']['lat'];
$longitude = $geocodeObject['results'][0]['geometry']['location']['lng'];
// set request options
$responseStyle = 'short'; // the length of the response
$citySize = 'cities15000'; // the minimal number of citizens a city must have
$radius = 30; // the radius in KM
$maxRows = 30; // the maximum number of rows to retrieve
$username = '{YOUR USERNAME}'; // the username of your GeoNames account
// get nearby cities based on range as array from The GeoNames API
$nearbyCities = json_decode(file_get_contents('http://api.geonames.org/findNearbyPlaceNameJSON?lat='.$latitude.'&lng='.$longitude.'&style='.$responseStyle.'&cities='.$citySize.'&radius='.$radius.'&maxRows='.$maxRows.'&username='.$username, true));
// foreach nearby city get city details
foreach($nearbyCities->geonames as $cityDetails)
{
// do something per nearby city
}
您还应该添加virtual Question Question { get; set; }
,这样当您加载int QuestionID { get; set; }
时,您将设置QuestionID值,这意味着您的问题可以为空,因为QuestionID信息已足够。Answer
并拥有context.Entry(entityToUpdate).State = EntityState.Modified;
,那么当您在context.Configuration.AutoDetectChangesEnabled = true;
上更改内容时,保存更改只会更新已更改的值,而不会更新其他值,因此null属性不会有问题。