在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();
}
答案 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
为了获得记录和问题,我有这些课程:
DbContext
的上下文我在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();
}
这样,您可以添加任意数量的实体,只需要一个保存和删除方法。