Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架不会保存所有更改_C#_Entity Framework - Fatal编程技术网

C# 实体框架不会保存所有更改

C# 实体框架不会保存所有更改,c#,entity-framework,C#,Entity Framework,这一次我几乎要哭了 我有一个用户对象 此对象具有多个属性FirstName、LastName等。所有属性都是简单类型。字符串int等 这些可以很好地加载和更新 public class Jobwalker { [Key] public Int64 ID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string

这一次我几乎要哭了

我有一个用户对象 此对象具有多个属性FirstName、LastName等。所有属性都是简单类型。字符串int等

这些可以很好地加载和更新

public class Jobwalker
{
    [Key]
    public Int64 ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public bool Suspended { get; set; }
    public TelephoneCountryCode TelephoneCountryCodeObject { get; set; }
    ...
但是userobject也有一个属性'TelephoneCountryCodeObject',它是另一个类

public class TelephoneCountryCode
{
    [Key]
    public Guid ID { get; set; }
    public string Code { get; set; }
    public string Country { get; set; }

    public TelephoneCountryCode()
    {
    }
    ...
我可以创建删除一个dmodify'TelephoneCountryCode'-对象, 但是当我试图保存用户对象的实例时,只有简单类型得到更新

public void Save()
    {
        try
        {
            using (var db = new MainContext())
            {

                db.TelephoneCountryCodes.Attach(TelephoneCountryCodeObject);
                Jobwalker result = (from jw in db.Jobwalkers
                                        .Include("TelephoneCountryCodeObject")
                                    where jw.UmbracoMemberID == UmbracoMemberID
                                    select jw).FirstOrDefault();


                db.Entry(result).CurrentValues.SetValues(this);

                if (this.TelephoneCountryCodeObject != null)
                {
                    result.TelephoneCountryCodeObject = db.TelephoneCountryCodes.Find(this.TelephoneCountryCodeObject.ID);
                }
                else
                {
                    result.TelephoneCountryCodeObject = null;
                }

                db.Entry(result).State = EntityState.Modified;

                db.SaveChanges();
            }
        }
        catch(Exception ex)
        {
            throw;
        }
    }
任何想法都将不胜感激

编辑: 我创建了这个超级简单的测试方法

 public static void TEST()
    {
        try
        {
            using (var db = new MainContext())
            {
                Jobwalker result = (from jw in db.Jobwalkers
                                        .Include("TelephoneCountryCodeObject")
                                    where jw.UmbracoMemberID == 1184
                                    select jw).FirstOrDefault();



                result.TelephoneCountryCodeObject = TelephoneCountryCode.GetByName("denmark");
                db.TelephoneCountryCodes.Attach(result.TelephoneCountryCodeObject);
                result.FirstName = "Flemming";

                db.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            throw;
        }
    }

这就像它应该做的那样。那么为什么**won my regular Save()方法不起作用?

这很可能是因为
TelephoneCountryCodeObject
不是数据库的动态代理,可能只是一个普通对象。我相信,如果附加结果,则可以保存更改

Jobwalker result = (from jw in db.Jobwalkers
  .Include("TelephoneCountryCodeObject")
  where jw.UmbracoMemberID == UmbracoMemberID
  select jw).FirstOrDefault();
db.TelephoneCountryCodes.Attach(result);

如果您需要更新已分离的实体(例如,您实例化了对象,但没有从数据库中提取),则应具有该实体的主键并使用以下代码:

public void Update(Jobwalker detachedEntity)
{
    DB.Jobwalkers.Attach(detachedEntity);
    DB.Entry(detachedEntity).State = EntityState.Modified;
}

// in your code to save Jobwalker detached object do this:
Update(this); // `this` is the Jobwalker detached object
DB.SaveChanges();

不需要额外的代码,EF将检测您的更改并更新实体,并将子实体添加到数据库。

作为旁注,
using
语句隐式使用
try
块来防止异常,因此您不需要将其封装在静默的try catch中。Jobwalker result=(来自db.Jobwalkers.Include中的jw(“TelephoneCountryCodeObject”),其中jw.UmbracoMemberID==UmbracoMemberID选择jw)。FirstOrDefault();您确定返回了正确的数据吗?@GoranŠtuc是的,我找到了正确的用户。当我尝试设置FirstName和TelephoneCountryCodeObject时,FirstName会更新,但TelephoneCountryCodeObject仍然为空…可能TelephoneCountryCodeObject导航属性映射不正确?可能它映射到Jobwalke上r类,但不在用户类上?它是如何映射的?我认为您应该进一步解释您的问题。您是否使用CodeFirst?您的
Save
方法位于哪里?您如何检查
TelephoneCountryCode
是否更新?(您是在SqlServer上运行sql查询还是仅使用您的代码)db.TelephoneCountryCodes.Attach(结果);不起作用,因为结果的类型为JobWalker,而不是TelephoneCountryCode相同的结果:(.只更新名字。我开始认为我的代码只是FUBARI我不明白为什么EF对我来说这么难用?我正在认真考虑去掉EF,把所有东西都转换成存储过程。这样我就知道,如果我告诉数据库保存一些东西,它就会被保存。@FlyingHippo:作为一条建议:请小心清楚当你问问题时,确切地说出你想做什么!一旦你知道如何使用EF,它就变得轻而易举了。你只需要澄清你想将对象添加到
DB.TelephoneCountryCodes
,或者只是更新子实体(意思是
jw.TelephoneCountryCodeObject
),我会告诉你怎么做!目前上面的代码添加了实体。我想你正在尝试更新
JobWalker
和它的子对象类型
TelephoneCountryCode
!?我感谢你的帮助,但我得出的结论是我的代码太乱了。我将从头开始。我将请将您的回答标记为已接受,因为它确实对我有所帮助。再次感谢。不客气。请尝试阅读有关EF的问题。