实体框架模型属性未正确更新

时间:2013-05-08 12:23:05

标签: .net c#-4.0 ef-code-first entity-framework-4.1

我有下面提到的2个型号。

GeoLocation 型号:

public class GeoLocation {
        public GeoLocation() { }
        public int Id { get; set; }
        public double Latitude { get; set; }
        public double Longitude { get; set; }
    }

提供商型号:

public class Provider
    {
        public Provider()
        {
            Id = Guid.NewGuid();
            Created = DateTime.Now;
        }

        public Guid Id { get; set; }
        [Required]
        public string Name { get; set; }

        public virtual GeoLocation Location { get; set; }

    }

存储库方法:

public void SetLocation(string providerKey, GeoLocation location)
        {
            var provider = (from p in Catalog.Providers
                            where p.Key == providerKey
                            select p).Single();

            provider.Location = location;

            Catalog.SaveChanges();
}

如上所述我需要更新Provider Table的Location对象。但是上面的代码给出了奇怪的结果。那就是当传入的位置对象有Id时我们说15.然后我需要更新那个ID进入提供者表位置ID 。但是在上面的代码之后它更新为16而不是15。你能告诉我为什么?这里的根本问题是什么?

注意:我使用默认EF约定映射。

更新:我在这里找到了问题。那就是我把provider.Location = location; GeoLocation 自动增量ID增加1 。那是什么原因。那我怎么能避免呢?

1 个答案:

答案 0 :(得分:1)

你是如何得到这个位置的?问题是您的EF上下文(Catalog)认为该位置是一个要保留的新对象(=它会生成插入到位置表中)。您必须通知目录它已经是现有对象。

这可能会成为一个伎俩:

if (location.Id > 0) {
    Catalog.GeoLocations.Attach(location);
} 

provider.Location = location;