0

Asp.Net MVC、Entity Framework を使用しています。以下のようなフォームがあります。

ここに画像の説明を入力

ここでは、ドロップダウン リストはテーブル (タイプ) から入力されます。チェックボックスは別のテーブル (テスト) から入力されます。テーブルは次のようになります。

public class Types 
{
    public int TypesID{get;set;}
    public string TestName { get; set; }
    public string TestExplanation { get; set; }
    public int TestTime { get; set; }
}

public class Tests
{
    public int TestID{get;set;
    public string Name { get; set; }
    public string Code { get; set; }
}

public class Types_Tests
{
   public int Types_TestsID{ get; set; }
   public int TypesID { get; set; }
   public int TestsID { get; set; }

   public virtual Types Types { get; set; }
   public virtual Tests Tests { get; set; }
}

Types_test テーブルは、Types と Tests の間の関係テーブルです。Kaydet ボタンをクリックすると、タイプとチェック済みのテストが保存されます。ViewBag、javascript、および hdnvalue を使用してこの操作を行いました。チェックボックスの値を hdntext に追加しました。以下のような保存プロセスを作成しました。

[HttpPost]
public ActionResult Index(string drpType, string hdntesttypes)
    {
        var TypeList = Types.GetAll();
        ViewBag.TypesList = new SelectList(TypeList, "Id", "Name");

        var testypeList = testTypes.GetAll();
        ViewBag.TestTypesList = new SelectList(testypeList, "Id", "TestName");


        GenericRepository<TestDisabledTypes> testDisabledRepository = new GenericRepository<TestDisabledTypes>(_context);

        if (!string.IsNullOrEmpty(hdntesttypes))
        {
            string[] disabletypesArray = hdntesttypes.Split(',');

            using (TransactionScope trns = new TransactionScope())
            {

                for (int i = 0; i < disabletypesArray.Length; i++)
                {
                    Test_Types types = new Test_Types ();
                    types.TestTypesID = Convert.ToInt32(disabletypesArray[i]);
                    types.TypesID = Convert.ToInt32(drpType);
                    testDisabledRepository.Insert(types);
                }

                trns.Complete();

            }
        }

        return View();
    }

それはうまくいきます。しかし、私はこのプロセスのより良い解決策を探しています。誰かが私に何か考えを与えることができますか? ありがとう。

4

2 に答える 2

0

エンティティ クラスに追加の属性が必要ない場合は、リンク テーブルを作成する必要はありません。次のクラスを定義するだけで、EF によってリンク テーブルが自動的に生成されます。

public class Type 
{
    public int TypesID{get;set;}
    public string TestName { get; set; }
    public string TestExplanation { get; set; }
    public int TestTime { get; set; }
    public ICollection<Test> Tests { get; set; }
}

public class Test
{
    public int TestID{get;set;
    public string Name { get; set; }
    public string Code { get; set; }
    public ICollection<Type> Types {get;set;}
}
于 2013-08-05T15:13:41.833 に答える
0

さて、EntityFramework多対多の関係オブジェクトを作成したい場合は、「リンク」エンティティの新しいオブジェクトを作成する必要があります。残念ながら、最初のオブジェクトを追加し、2 番目のオブジェクトを追加して、「皆さん、多対多の関係にあります。それで満足していますか?」ということはできません。:)関係オブジェクトを作成し、それに適切なフィールドを設定し(これらは2つのオブジェクト自体のIDだと思います)、モデルの関係コレクション(エンティティ)に追加する必要があります。ただし、そうする前に、リンクしているデータを持つオブジェクトがデータベースに既に存在することを確認する必要があります。そうしないと、エラーが発生します

また、データを取得/保存するたびにEFが自動的にトランザクションを作成するため、手動でトランザクションを作成する必要はありません

于 2016-01-08T21:23:09.560 に答える