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

ただし、ユーザーオブジェクトには、別のクラスであるプロパティ「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;
        }
    }

これは想定どおりに機能します。では、 * * 通常の 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 に答える