如何在实体框架中“加载”或“获取”域?

时间:2013-05-22 18:11:53

标签: entity-framework

在nhibernate中,您可以使用“加载”或“获取”来获取“Id”并将其加载到域模型中。你怎么在EF做这样的事情?

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

在nhibernate中我会做这样的事情

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

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

2 个答案:

答案 0 :(得分:0)

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

在EF&gt; 4,增加了FK Association的概念。这意味着,如果您的实体具有名为BrandId的属性,则可以使用该属性。查看更多信息here

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

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

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

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

在EF&lt; 4,您必须根据值创建实体键。有关详细信息,请参阅this question

Product p = new Product() {
    Name = productName
};
p.BrandReference.EntityKey = new EntityKey("MyEntities.Brand", "BrandId", brandId);

答案 1 :(得分: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,取决于是否将Guid BrandId放在那里。

查看我的其他问题和答案,看看有什么关联:question

为了获得记录和问题,我有这些课程:

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

我在Repository中有这个保存方法:

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

这样,您可以添加任意数量的实体,只需要一个保存和删除方法。