为什么在我的实体框架中添加一个子元素,尝试插入一个新的父项? [英] Why does adding a child element to my entity framework try and insert a new parent?
问题描述
我在WCF中有一个C#REST服务,它位于SQL 2008的EF 4.2框架之上。有几个实体,但两个重要的是Trips和他们的孩子,PlacesOfInterest。
I have a C# REST Service in WCF that sits on top of an EF 4.2 framework on SQL 2008. There are a few entities, but the two that matter are Trips and their children, PlacesOfInterest.
这里是表:
-- Creating table 'Trips'
CREATE TABLE [dbo].[Trips] (
[Id] uniqueidentifier NOT NULL,
[Name] nvarchar(max) NOT NULL,
[ArrivalDate] datetime NULL,
[DepartureDate] datetime NULL,
[WhereTo] nvarchar(max) NOT NULL,
[CreatedDate] datetime NULL,
[UpdatedDate] datetime NULL,
[Album] nvarchar(max) NOT NULL,
[UserToken] nvarchar(max) NOT NULL,
[WallPostId] nvarchar(max) NOT NULL
);
GO
-- Creating table 'PlacesOfInterest'
CREATE TABLE [dbo].[PlacesOfInterest] (
[Id] uniqueidentifier NOT NULL,
[PhoneNumber] nvarchar(max) NOT NULL,
[SmallPicture] nvarchar(max) NOT NULL,
[LargePicture] nvarchar(max) NOT NULL,
[HostId] nvarchar(max) NOT NULL,
[HostName] nvarchar(max) NOT NULL,
[Address1] nvarchar(max) NOT NULL,
[Address2] nvarchar(max) NOT NULL,
[Address3] nvarchar(max) NOT NULL,
[City] nvarchar(max) NOT NULL,
[State] nvarchar(max) NOT NULL,
[Zip] nvarchar(max) NOT NULL,
[Latitude] bigint NOT NULL,
[Longitude] bigint NOT NULL,
[URL] nvarchar(max) NOT NULL,
[MapUrl] nvarchar(max) NOT NULL,
[Hours] nvarchar(max) NOT NULL,
[Name] nvarchar(max) NOT NULL,
[PageId] nvarchar(max) NOT NULL,
[Trip_Id] uniqueidentifier NOT NULL,
[Category_Id] int NULL
);
GO
这是我的POCO模型。
Here are my POCO Models.
public class Trip
{
public Guid Id { get; set; }
public string Name { get; set; }
public DateTime ArrivalDate { get; set; }
public DateTime DepartureDate { get; set; }
public string WhereTo { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime UpdatedDate { get; set; }
public string Album { get; set; }
public List<PlaceOfInterest> PlacesOfInterest { get; set; }
public List<Photo> Photos { get; set; }
public string UserToken { get; set; }
public string WallPostId { get; set; }
}
public class PlaceOfInterest
{
public Guid Id { get; set; }
public string Name { get; set; }
public string PhoneNumber { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
public long Latitude { get; set; }
public long Longitude { get; set; }
public string SmallPicture { get; set; }
public string LargePicture { get; set; }
public string HostId { get; set; }
public string HostName { get; set; }
public string URL { get; set; }
public string MapUrl { get; set; }
public string Hours { get; set; }
public Category Category { get; set; }
public List<Photo> Photos { get; set; }
public List<Checkin> Checkins { get; set; }
public List<PoiAttribute> PoiAttributes { get; set; }
public Guid TripId { get; set; }
public string PageId { get; set; }
[IgnoreDataMember]
public Trip Trip { get; set; }
}
当我添加一个新的PlaceOfInterest时,实体框架试图插入一个列表,我得到一个重复的键错误。
When I add a new PlaceOfInterest, the Entity Framework tries to insert a list, and I get a duplicate key error.
public static Guid Create(string tripId, Model.PlaceOfInterest instance)
{
var context = new Model.POCOTripContext();
var cleanPoi = new Model.PlaceOfInterest();
cleanPoi.Id = Guid.NewGuid();
cleanPoi.Address1 = instance.Address1;
cleanPoi.Address2 = instance.Address2;
cleanPoi.Address3 = instance.Address3;
cleanPoi.City = instance.City;
cleanPoi.HostId = instance.HostId;
cleanPoi.HostName = instance.HostName;
cleanPoi.Hours = instance.Hours;
cleanPoi.LargePicture = instance.LargePicture;
cleanPoi.Latitude = instance.Latitude;
cleanPoi.Longitude = instance.Longitude;
cleanPoi.MapUrl = instance.MapUrl;
cleanPoi.Name = instance.Name;
cleanPoi.PageId = instance.PageId;
cleanPoi.PhoneNumber = instance.PhoneNumber;
cleanPoi.SmallPicture = instance.PhoneNumber;
cleanPoi.State = instance.State;
cleanPoi.Trip = Library.Trip.Get(new Guid(tripId));
cleanPoi.URL = instance.URL;
cleanPoi.Zip = instance.Zip;
context.PlacesOfInterest.AddObject(cleanPoi);
context.SaveChanges();
return cleanPoi.Id;
}
我不想让它插入那行,我只是想更新数据库中的TripId列。我做错了什么?
I don't want it to insert that trip, I just want it to update the TripId column in the database. What am I doing wrong?
推荐答案
很可能这一行是问题:
cleanPoi.Trip = Library.Trip.Get(new Guid(tripId))
如果 Get
从DB加载旅程,那么它显然在另一个上下文中加载 context
。你应该使用相同的上下文。要写这个丑陋的东西,就像: Get(context,new Guid(tripId))
然后使用注入的上下文。
If Get
loads the trip from the DB then it is loading it obviously in another context than context
. You should use the same context. To write it ugly, something like: Get(context, new Guid(tripId))
and then use that injected context.
如果 Get
只需创建一个旅程的实例
(新旅行{... }
),您必须将其附加到上下文中:
If Get
just creates an instance of Trip
(new Trip { ... }
), you must attach it to the context:
cleanPoi.Trip = Library.Trip.Get(new Guid(tripId))
context.Trips.Attach(cleanPoi.Trip);
但是你们都不需要,因为你显然有一个外键属性。那么这就够了:
But you all don't need that because you apparently have a foreign key property. Then this is enough:
cleanPoi.TripId = new Guid(tripId);
这篇关于为什么在我的实体框架中添加一个子元素,尝试插入一个新的父项?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!