必须有一种更好的方法来使用LINQ添加这些内容,对吧



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

问题的一部分不是Linq,而是如何使用EF。基于该示例代码,您将其用作数据层包装器,而不是ORM。在构建对象图时,您应该尽可能地处理对象,而不是外键ID。ORM的强大之处在于,您可以专门处理映射到数据的对象图,这样,当您告诉ORM保存对象(及其关联的亲属)时,ORM就可以完成插入/更新新记录和连接密钥的所有工作。你在代码中做所有额外的工作,像EF这样的ORM应该允许你用几行代码完成你想要的。

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

我要考虑的是将组合框绑定到ItemType/ReRegions,其中"Other"是一个特定的占位符,如果根据文本字段中的条目进行选择,代码将用新对象替换它。然后,您只需设置引用并保存Item,而不是在附加到"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();
}

最新更新