EF5已成功提交对数据库的更改...无法设置字段/属性

时间:2013-07-31 13:53:13

标签: c# entity-framework ef-code-first

我一直在寻找几天试图弄清楚这个。它正确保存我的记录,但抛出以下错误:

The changes to the database were committed successfully, but an error occurred while updating the object context. The ObjectContext might be in an inconsistent state. Inner exception message: Unable to set field/property Actors on entity type BOR.DataModel.StagComplaint. See InnerException for details.

我在带有支持WCF服务的C#Web Forms解决方案中使用Code First和EF 5。这是我的POCO课程:

public partial class StagComplaint : ComplaintBase {
    public IList<StagParcel> Parcels { get; set; }
    public IList<StagActor> Actors { get; set; }
    public IList<StagRectification> Rectifications { get; set; }
    public ComplaintType ComplaintType { get; set; }
    public int ComplaintTypeID { get; set; }

    public StagComplaint() {
        this.Parcels = new List<StagParcel>();
        this.Actors = new List<StagActor>();
        this.Rectifications = new List<StagRectification>();
    }
}

public class ComplaintBase : BORBase {
    public string Number { get; set; }
    public int ParentID { get; set; }
    public int TaxYear { get; set; }
    public string Category { get; set; }
    public double BuildingValue { get; set; }
    public double LandValue { get; set; }
    public double OwnerOpinion { get; set; }
    public string Notes { get; set; }
}

public class BORBase {
    [Required]
    public DateTime CreationDate { get; set; }
    public int ID { get; set; }
    [MaxLength(25)]
    [Required]
    public string UserIdentification { get; set; }
}

public partial class StagParcel : ParcelBase {
    public virtual StagActor Owner { get; set; }
    [ForeignKey("Owner")]
    public int OwnerID { get; set; }
    public StagAddress Address { get; set; }
    [IgnoreDataMember]
    public virtual StagComplaint Complaint { get; set; }
    public int ComplaintID { get; set; }

    public StagParcel() {
        this.Address = new StagAddress();
    }
}

public class ParcelBase : BORBase {
    public string Number { get; set; }
    public double BuildingValue { get; set; }
    public double LandValue { get; set; }
    public double OwnerOpinion { get; set; }
    public string LandUseCode { get; set; }
    public string NeighborhoodCode { get; set; }
    public string TaxDistrict { get; set; }
    public string SchoolDistrict { get; set; }
    public int SchoolBoardID { get; set; }
}

public partial class StagActor : ActorBase {
    public StagAddress Address { get; set; }
    public virtual IList<StagEmail> Emails { get; set; }
    public virtual IList<StagPhone> Phones { get; set; }

    [IgnoreDataMember]
    public virtual StagComplaint Complaint { get; set; }
    public int ComplaintID { get; set; }
    public virtual Role Role { get; set; }
    public int RoleID { get; set; }

    public StagActor() {
        this.Emails = new List<StagEmail>();
        this.Phones = new List<StagPhone>();
        this.Address = new StagAddress();
    }
}

public class ActorBase : BORBase {
    public string Name { get; set; }
}

public class StagRectification : BORBase {
    public bool Active { get; set; }
    public string Notes { get; set; }
    public virtual RectificationType RectificationType { get; set; }
    public int RectificationTypeID { get; set; }

    [IgnoreDataMember]
    public virtual StagComplaint Complaint { get; set; }
    public int ComplaintID { get; set; }
}

这是我用来创建投诉的客户端代码:

public int AddParcelsToStagingComplaint(List<string> parcelIDs, string userID) {
    StagComplaint comp = new StagComplaint();
    int Result = 0;

    using (BORServiceClient db = new BORServiceClient()) {
        comp = new StagComplaint() {
            BuildingValue = 111222,
            Category = "*",
            LandValue = 222333,
            Number = "*",
            TaxYear = DateTime.Now.Year,
            ComplaintTypeID = 1,
            UserIdentification = userID,
            CreationDate = DateTime.Now,
        };

        StagAddress ca = new StagAddress() { Line1 = "670 Harvard Blvd", City = "Cleveland", State = "OH", ZipCode = "44113", };
        List<StagPhone> ps = new List<StagPhone>();

        ps.Add(new StagPhone() { Number = "5556664646", Type = PhoneTypes.Home, UserIdentification = userID, CreationDate = DateTime.Now, });
        comp.Actors.Add(
            new StagActor() {
                Name = "Joe Schmoe",
                Address = ca,
                Phones = ps,
                RoleID = 1,
                UserIdentification = userID,
                CreationDate = DateTime.Now,
            }
        );

        StagAddress aa = new StagAddress() {
            City = wp.Address.City,
            Line1 = wp.Address.Line1,
            Line2 = wp.Address.Line2,
            State = wp.Address.State,
            ZipCode = wp.Address.ZipCode,
        };

        ps = new List<StagPhone>();
        ps.Add(new StagPhone() { Number = "4448887878", Type = PhoneTypes.Work, UserIdentification = userID, CreationDate = DateTime.Now, });

        StagParcel p = new StagParcel() {
            Address = new StagAddress() { Line1 = "4 Oxford Drive", City = "Hudson", State = "OH", ZipCode = "44236" },
            BuildingValue = wp.BuildingValue,
            LandUseCode = wp.LandUseCode,
            LandValue = wp.LandValue,
            NeighborhoodCode = wp.NeighborhoodCode,
            Number = wp.Number,
            Owner = new StagActor() { Name = "Owner Person", Address = aa, RoleID = 2, Phones = ps, UserIdentification = userID, CreationDate = DateTime.Now, },
            OwnerOpinion = wp.OwnerOpinion,
            SchoolBoardID = wp.SchoolBoardID,
            SchoolDistrict = wp.SchoolDistrict,
            TaxDistrict = wp.TaxDistrict,
            UserIdentification = userID,
            CreationDate = DateTime.Now,
        };

        comp.Parcels.Add(p);

        ServiceResponse<int> saved = db.AddComplaint((ComplaintBase)comp, Contexts.Staging, userID);

        if (saved.WasSuccessful)
            Result = saved.Result;
    } // using the database

    return Result;
} // AddParcelsToStagingComplaint - Method

以下是调用的WCF方法:

using (StagComplaintRepo cr = new StagComplaintRepo()) {
    cr.Add((StagComplaint)complaint, userID);

    if (cr.Save()) {
        Result.Result = complaint.ID;
        Result.WasSuccessful = true;
    } else {
        Result.AddException(string.Format("Unable to create a new Complaint in the {0} context.", context));
    } // if the save was successful
} // using the Complaint Repository

以下是具有Save和Add方法的BaseRepository:

public abstract class BaseRepository<T> : IDisposable, IRepository<T> where T : class {

    public virtual bool Save(bool detectChanges = false) {
        if (detectChanges == true)
            this.Entities.ChangeTracker.DetectChanges();

        return (this.Entities.SaveChanges() > 0);
    }

    public virtual void Add(T entity, string userID) {
        this.Entities.Set<T>().Add(entity);
    }
    ...
}

上面的这个失败.Entities.SaveChanges()调用此帖子顶部提到的错误。没有额外的内部异常。如果我只填写所需的Complaint属性并且是该对象的一部分,那么它可以工作。但是一旦我用一个Actor添加一个Parcel就失败了。

我认为它很简单,也许需要打开或关闭开关。但类似的错误似乎都引用了AcceptChanges,这不是问题所在。至少基于错误消息。任何帮助将不胜感激。

修改 这是完整的堆栈跟踪:

at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at System.Data.Entity.DbContext.SaveChanges()
at BOR.WebService.Repositories.BaseRepository`1.Save(Boolean detectChanges) in d:\DevProjects\BOR\WebService\Main\Source\WebServiceSolution\WcfServiceProject\Repositories\BaseRepository.cs:line 22
at BOR.WebService.BORService.AddComplaint(ComplaintBase complaint, Contexts context, String userID) in d:\DevProjects\BOR\WebService\Main\Source\WebServiceSolution\WcfServiceProject\BORService.svc.cs:line 65

第22行是:

return (this.Entities.SaveChanges() > 0);

第65行是:

if (cr.Save()) {

0 个答案:

没有答案