簡體   English   中英

必須有一種更好的方法來使用LINQ添加它們,對嗎?

[英]There has to be a better way to add these using LINQ, right?

我是LINQ的新手,並提出以下內容,使用LINQ和EF5向我的數據庫添加新信息,但我確信有一種更有效,更好的方法,我只是不知道它。 我希望得到一些關於我能做些什么來加入同樣但有更少/更有效的代碼的信息。

            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();
            }

Item.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"));
}

部分問題不在於Linq,而是你如何使用EF。 基於該示例代碼,您將其用作數據層包裝器而不是ORM。 在構造對象圖時,您應該處理可以使用的對象,而不是外鍵ID。 ORM的強大之處在於您可以專門處理映射到數據的對象圖,這樣當您告訴ORM保存對象(以及它的相關親屬)時,ORM會完成插入/更新新對象的所有工作。記錄和連線鍵。 你在代碼中做了所有額外的工作,其中像EF這樣的ORM應該允許你用一些線來完成你想要的東西。

首先,在處理組合框時,將它們綁定到包含查找值ID的數據結構,您可以解析現有ItemTypes或Regions的實例以與新Item關聯。 (或者在選擇“其他”的情況下。

我要看的是將組合框綁定到ItemType / Regions,其中“Other”是一個特定的占位符,如果根據文本字段中的條目選擇,代碼將替換為新對象。 然后,不是在附加到“Item”之前保存新對象,而是簡單地設置引用並保存Item,它應該為新查找對象級聯插入操作。

執行此代碼后,EF將自動將ID添加到NewItemType實體中。 你不需要再去找它,你可以說NewItemType.ID 這只能在您調用db.SaveChanges()之后才能工作。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM