0

在 nhibernate 中,您可以使用“Load”或“Get”来获取“Id”并将其加载到域模型中。你如何在 EF 中做类似的事情?

我有一些从客户端发送到服务器的“ID”。我想获取新项目并将它们与新项目相关联,而不必实际从数据库中获取它们。

在休眠中我会做这样的事情

public void MyMethod(int brandId, string productName)
{
   Product p = new Product()
   {
        Name = productName,
        Brand = session.Load<Brand>(brandId)
   };

   session.Save(p);
   session.Commit();
}
4

2 回答 2

0

答案取决于您使用的实体框架的版本。

在 EF > 4 中,FK Association添加了 的概念。这意味着,如果您的实体有一个名为 的属性BrandId,您可以简单地使用它。在此处查看更多信息。

Product p = new Product()
{
    Name = productName,
    BrandId = brandId
};

如果您使用 Code First,您可以在模型上定义此属性以及该Brand属性。在此处查看更多信息。

public class Product {
    public string Name { get; set; }
    public int BrandId { get; set; }
    public virtual Brand Brand { get; set; }
}

如果您从数据库创建模型,您可以设置一个选项以在设计器中保留 ID 属性。

在 EF < 4 中,您必须根据值创建实体键。有关更多信息,请参阅此问题

Product p = new Product() {
    Name = productName
};
p.BrandReference.EntityKey = new EntityKey("MyEntities.Brand", "BrandId", brandId);
于 2013-05-22T18:26:03.117 回答
0

使用实体框架我在模型上使用属性装饰

public class DbEntity
{
    [Key, DatabaseGenerated()]
    public Guid Id {get;set;}
}

public class Product : DbEntity
{
   public string Name {get;set;}
   public virtual Brand Brand {get;set;}
}

public class Brand : DbEntity
{
   public string Name {get;set;}
}

我们virtual用于延迟加载,取决于你是否想要 Cascade On Delete 取决于你是否放在Guid BrandId那里。

查看我的其他问题和答案,了解关联的全部内容:问题

为了获得记录和杂物,我有这些课程:

  • 继承DbContext自 System.Data.Entity 的上下文(我认为)
  • 使用实例化上下文的存储库
  • 被注入的 IRepository

它在我有这个保存方法的存储库中:

public void SaveEntity<TEntity>(TEntity entity) where TEntity : DbEntity
{
   if (entity.Id.Equals(Guid.Empty))
      _context.Set<TENtity>().Add(entity);
   else
      _context.Entry(entity).State = Modified;

   _context.SaveChanges()
}

public void DeleteEntity<TEntity>(TEntity entity) where TEntity : DbEntity
{
   _context.Set<TEntity>().Remove(entity);

   _context.SaveChanges();
}

这样,您可以添加尽可能多的实体,并且只需要一种保存和删除方法。

于 2013-05-22T18:38:53.260 回答