3

我非常接近这一点。

我有一个用户对象,这个对象有几个属性 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'-objects 就好了,但是当我尝试保存用户对象的实例时,只有简单类型会更新?

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;
        }
    }

这就像它应该的那样工作。那么为什么* * 我的常规 Save() 方法不起作用?

4

2 回答 2

3

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

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 将检测您的更改并更新实体并将子实体添加到数据库中。

于 2013-09-17T20:58:46.587 回答
1

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

Jobwalker result = (from jw in db.Jobwalkers
  .Include("TelephoneCountryCodeObject")
  where jw.UmbracoMemberID == UmbracoMemberID
  select jw).FirstOrDefault();
db.TelephoneCountryCodes.Attach(result);
于 2013-09-16T23:12:34.660 回答