2011-01-13 9 views
0

CaseRepository.csでboolメソッドを使用してケースを追加しようとすると、そのケースのオーナー(ケースを作成した人)を特定するためにユーザーをケースオブジェクトに割り当てます。私はパラメータとして渡している既存のユーザーですが、それを割り当てるために、新しいUserオブジェクトをテーブルに追加しようとしますか?EF - 既存のオブジェクトを使用する代わりに新しいオブジェクトを追加しようとしていますか?

要するに、ユーザーがケースを作成し、そのケースをユーザーに割り当てるようにしようとしています。

MembershipUserをUserオブジェクトにマッピングする理由は、EF(コードファースト)がCRUD操作に使用できるようにするためです。

// CaseController.cs

[AuthWhere(AuthorizeRole.Developer)] 
[HttpPost] 
public ActionResult Create(CreateCaseViewModel model) 
{ 
    var success = false; 
    string message; 

    User user = Mapper.Map<MembershipUser, User>(_membershipService.GetUserByUserName(User.Identity.Name)); 
    Case createCase = _caseService.CreateCase(model.Topic, model.Message); 

    bool addCase = _caseService.AddCase(createCase, user); 

    if(!addCase) 
    { 
     message = ControllerResources.CaseCreateFail; 
    } 
    else 
    { 
     success = true; 
     message = ControllerResources.CaseCreateSuccess; 
    } 

    return Json(new 
    { 
     Success = success, 
     Message = message, 
     Partial = RenderPartialViewToString("List", GetCases) 
    }); 
} 

// RepositoryBase.cs

public class RepositoryBase<T> : IRepository<T> where T : class 
{ 
    public IDbContext Context { get; private set; } 
    public IDbSet<T> ObjectSet { get; private set; } 

    public RepositoryBase(IDbContext context) 
    { 
     Contract.Requires(context != null); 

     Context = context; 

     if (context != null) 
     { 
      ObjectSet = Context.CreateDbSet<T>(); 

      if (ObjectSet == null) 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
    } 

    [ContractInvariantMethod] 
    private void Invariant() 
    { 
     Contract.Invariant(Context != null); 
     Contract.Invariant(ObjectSet != null); 
    } 

    public IRepository<T> Add(T entity) 
    { 
     ObjectSet.Add(entity); 
     return this; 
    } 

    public IRepository<T> SaveChanges() 
    { 
     Context.SaveChanges(); 
     return this; 
    } 
} 

// CaseRepository.cs

public class CaseRepository : RepositoryBase<Case>, ICaseRepository 
{ 
    public CaseRepository(IDbContext context) 
      : base(context) 
    { 
     Contract.Requires(context != null); 
    } 

    public bool AddCase(Case @case, User user) 
    { 
     @case.User = user; 

     ObjectSet.Add(@case); 
     Context.SaveChanges(); 

     return true; 
    } 
} 
+0

http://www.codeproject.com/Articles/318820/ASP-NET-MVC-3-0-JqGrid-Unit-Of-Work-Repository-EFおよびhttp:// weblogsに記載されている同様のクラス。 asp.net/dwahlin/archive/2012/03/04/new-pluralsight-course-building-asp-net-mvc-apps-with-ef-code-first-html5-and-jquery.aspx –

答えて

0

仮想のPOCOクラスで2つのマッピングを忘れました。

0

オブジェクトを既存の変更する場合は、あなたドンもう一度コンテキストに追加する必要はありません。したがって、更新のためにこの行を削除してください:

ObjectSet.Add(@case);

CaseRepositoryクラスに2つのメソッドAddとUpdateを作成することを検討する必要があります。

+0

あなたが持っているかもしれないそれは間違っている。私がしようとしているのは、ユーザーがケースを作成し、そのケースにそのユーザーを追加させることです。 – ebb

+0

申し訳ありませんが、私は次のユーザーの新しいインスタンスを作成していると思います: ユーザーuser = Mapper.Map (_ membershipService.GetUserByUserName(User.Identity.Name)); 最初にdatebaseからインスタンスを取得するのが最善の方法です。 – ShahidAzim

+0

そうです。考えてみれば、それはMembershipUserオブジェクトをとり、それをUserオブジェクトにします。ユーザーオブジェクトは、どのユーザーが作成を所有しているかを判断するために使用されますが、最初にEFコードを使用しています。ユーザーオブジェクトは、必要なデータを取得する必要があるaspnet_Usersテーブルにマップされます。 - したがって、渡されたUserオブジェクトはaspnet_Users ..から取得されたMembershipUserであり、したがって新しいオブジェクトではなく、Userオブジェクトだけです。 (投稿を更新しました) – ebb

関連する問題