1

MVC 4 と Entity Framework 5 に取り掛かったばかりで、自分が行っていることが正しいかどうかを知りたいですか?

UserObject と JobObject があり、jobObject には User Object への参照があります。

public class Job
{
    public int id { get; set; }
    public virtual MyUser User { get; set; }
    public JobType JobType { get; set; }
}

ジョブのインスタンスを作成したい場合、クエリ文字列にパラメーター UserID を渡しますが、ジョブは MyUser のインスタンスのみを処理します。

以下は、ユーザーをジョブに関連付ける正しい方法ですか?

[HttpPost]
public ActionResult Create(Job job, int userid)
{
   if (ModelState.IsValid)
   {    
     MyUser staffmember = db.MyUsers.Find(userid);
     if (staffmember == null)
      {
        return View("StaffMemberNotFound");
      }
     job.User = staffmember;
     db.Jobs.Add(job);
     db.SaveChanges(); 
   }
}

または、ユーザーをジョブに関連付けるより良い方法はありますか?

4

2 に答える 2

1

あなたのやり方でうまくいきますが、私は可能であれば単純に ID で作業することを好みます。

MyUserIdクラスにプロパティを追加することをお勧めしますJob(codefirst を使用している場合は、データベースを更新することを忘れないでください)。

public class Job
{
    public int id { get; set; }
    [ForeignKey("User")]
    public int MyUserId { get; set: }

    public virtual MyUser User { get; set; }
    public JobType JobType { get; set; }
}

次に、単に入力しMyUserIdます。また、チェックを変更して、id が存在するかどうかを確認するだけでなく、オブジェクトを見つけて EF にそれをクラスにマップさせてから返すこともできます。

[HttpPost]
public ActionResult Create(Job job, int userid)
{
   if (ModelState.IsValid)
   {    
     if (!db.MyUsers.Any(u => u.Id == userid)
     {
        return View("StaffMemberNotFound");
     }

     job.MyUserId = userid;
     db.Jobs.Add(job);
     db.SaveChanges(); 
   }
}

次にデータベースからレコードを取得するときに、EF が残りのマッピングを行います。

于 2013-04-02T16:42:16.553 に答える
0

あなたのアプローチはうまくいきます.あなたが行うことができる唯一の小さな最適化MyUser staffmember = db.MyUsers.Find(userid);は、userid.

私は ASP.NET MVC 4 と Entity Framework 5.0 を使用しています。これが私のコードです (モデル オブジェクトは異なりますが、目的は同じです)。

Models注:フォルダーを右クリックしてAdd->ADO.NET Entity Data ModelVS.NET 2012 を選択することで、EF にモデル クラスを生成させました。

Store.Models.Product

namespace Store.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Product
    {
        public long Id { get; set; }
        public string ProductName { get; set; }
        public decimal Price { get; set; }
        public int Quantity { get; set; }
        public System.DateTime DateAdded { get; set; }
        public Nullable<long> CategoryId { get; set; }

        public virtual Category Category { get; set; }
    }
}

Store.Models.Category

namespace Store.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Category
    {
        public Category()
        {
            this.Products = new HashSet<Product>();
        }

        public long Id { get; set; }
        public string CategoryName { get; set; }
        public System.DateTime DateAdded { get; set; }

        public virtual ICollection<Product> Products { get; set; }
    }
}

私のCreate.cshtmlページでは、ユーザーにドロップダウン リストから CategoryId を選択してもらいます。このカテゴリ ID は にバインドされていProduct.CategoryIdます。私の方法で私がすることはこれだけです:

製品コントローラー

public class ProductController : Controller
{
    ...
    [HttpPost]
    public ActionResult Create(Product product)
    {
        product.DateAdded = DateTime.Now;
        if (dbContext != null)
        {
            dbContext.Products.Add(product);
            dbContext.SaveChanges();
        }
        return RedirectToAction("Index");
    }
    ...
}
于 2013-04-02T19:11:15.457 に答える