0

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

项目.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; }
    }
}

项目类型.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 应该允许你用几行代码完成你想要的。

首先,在处理组合框时,将它们绑定到包含查找值 ID 的数据结构,您可以解析现有 ItemTypes 或 Regions 的实例以与新 Item 关联。(或在选择“其他”的情况下。

我要查看的是将组合框绑定到 ItemType/Regions,其中“Other”是一个特定的占位符,如果根据文本字段中的条目进行选择,代码将用新对象替换该占位符。然后,无需在附加到“项目”之前保存新对象,您只需设置引用并保存项目,该项目应为新查找对象级联插入操作。

于 2012-11-29T00:45:41.257 回答
0

执行此代码后,EF 会自动将 ID 放入您的NewItemType实体中。你不需要再去找它,你可以说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 回答