0

私はLINQを初めて使用し、LINQとEF5を使用してDBに新しい情報を追加するために以下を考え出しましたが、これを行うためのより効率的でより良い方法があると確信しています。私は同じことを達成するために何ができるかについていくつかの意見を得たいと思っていましたが、より少ない/より効率的なコードでした。

            using (var db = new FullContext())
            {
                if (ddlItemType.SelectedValue == "Other")
                {
                    var NewItemType = new ItemType { Name = tbNewType.Text };
                    db.ItemTypes.Add(NewItemType);
                    db.SaveChanges();
                }

                if (ddlRegion.SelectedValue == "Other")
                {
                    var NewRegion = new ReleaseRegion { Name = tbNewRegion.Text };
                    db.Regions.Add(NewRegion);
                    db.SaveChanges();


                }

                var NewItemTypeID = byte.Parse((from i in db.ItemTypes
                                                where i.Name == tbNewType.Text
                                                select new { i.ID }).ToString());

                var NewRegionID = byte.Parse((from r in db.Regions
                                              where r.Name == tbNewRegion.Text
                                              select new { r.ID }).ToString());

                var NewItem = new Item
                {
                    Name = tbItemName.Text,
                    TypeID = NewItemTypeID,
                    RegionID = NewRegionID,
                    Condition = ddlCondition.SelectedValue.ToString(),
                    UPC = tbUPC.Text,
                    ISBN = tbISBN.Text,
                    IsColleciton = cbIsCollection.Checked,
                    CollectionID = Convert.ToInt16(ddlCollection.SelectedValue),
                    Notes = tbNotes.Text
                };

                db.Items.Add(NewItem);
                db.SaveChanges();
            }

アイテム.cs:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FFCollection.DAL
{
    [Table("Items")]
    public class Item
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Int16 ID { get; set; }

        [Required]
        public string Name { get; set; }

        public byte TypeID { get; set; }

        [ForeignKey("TypeID")]
        public virtual ItemType Type { get; set; }

        public byte RegionID { get; set; }

        [ForeignKey("RegionID")]
        public virtual ReleaseRegion Region { get; set; }

        [Required]
        public string Condition { get; set; }

        public string UPC { get; set; }

        public string ISBN { get; set; }

        public string Notes { get; set; }

        [Required]
        public Boolean IsColleciton { get; set; }

        public Int16 CollectionID { get; set; }

        [ForeignKey("CollectionID")]
        public virtual Item InCollectionID { get; set; }
    }
}

ItemType.cs:

using System.ComponentModel.DataAnnotations.Schema;

namespace FFCollection.DAL
{
    public class ItemType
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public byte ID { get; set; }

        public string Name { get; set; }
    }
}

DDL へのデータバインディング:

using (var db = new FullContext())
            {
                ddlItemType.DataSource = (from t in db.ItemTypes
                                          select new { t.ID, t.Name }).ToList();
                ddlItemType.DataTextField = "Name";
                ddlItemType.DataValueField = "ID";
                ddlItemType.DataBind();
                ddlItemType.Items.Insert(0, new ListItem("Other", "Other"));
}
4

2 に答える 2

2

問題の一部は Linq ではなく、EF の使用方法にあります。そのコード例に基づいて、ORM ではなくデータ層ラッパーとして使用しています。オブジェクト グラフを作成するときは、外部キー ID ではなく、できる限りオブジェクトを処理する必要があります。ORM の威力は、データにマップされたオブジェクト グラフを具体的に処理できることです。そのため、ORM にオブジェクト (およびそれに関連する関連オブジェクト) を保存するように指示すると、ORM は新しいオブジェクトの挿入/更新のすべての作業を取り除きます。レコードとキーの配線。EF のような ORM を使用すると、数行で目的を達成できるはずです。

まず、コンボ ボックスを扱うときに、既存の ItemType または Region のインスタンスを解決して新しい Item に関連付けることができるルックアップ値の ID を含むデータ構造にそれらをバインドします。(または「その他」を選択した場合。

私が見ているのは、テキストフィールドのエントリに基づいて選択された場合にコードが新しいオブジェクトに置き換える特定のプレースホルダーである「その他」を使用して、コンボボックスを ItemType/Regions にバインドすることです。次に、「アイテム」に追加する前に新しいオブジェクトを保存するのではなく、参照を設定してアイテムを保存するだけで、新しいルックアップ オブジェクトの挿入操作をカスケードすることができます。

于 2012-11-29T00:45:41.257 に答える
0

NewItemTypeこのコードが実行されると、EF はエンティティに ID を自動的に挿入します。もう一度探しに行く必要はありませんNewItemType.ID。これは、すでに を呼び出した後にのみ機能しますdb.SaveChanges()

if (ddlItemType.SelectedValue == "Other")
{
    var NewItemType = new ItemType { Name = tbNewType.Text };
    db.ItemTypes.Add(NewItemType);
    db.SaveChanges();
}
于 2012-11-29T00:46:21.817 に答える