我想创建一个通用的C#类,其方法是使用Entity Framework向数据库添加一行。
我有一个名为Address
的表。我编写了以下代码来为数据库添加地址:
public class AddressExchange
{
public int Insert(Address address)
{
using (var db = new DemoWebEntities())
{
//db.AddObject("Address", address);
db.Addresses.AddObject(address);
db.SaveChanges();
return address.Id;
}
}
}
我想写一个通用类,它将为我的EDMX中的任何实体执行此操作。我认为应该看起来像这样:
public class EntityExchange<T, KeyType>
{
public KeyType Insert(T t)
{
using (var db = new DemoWebEntities())
{
// The entity set name might be wrong.
db.AddObject(typeof(T).Name, t);
// EF doesn't know what the primary key is.
return t.Id;
}
}
}
我认为可以使用AddObject
方法将对象添加到数据库中,但实体集名称不一定与类型名称相同,特别是如果它已经多元化了!
我还想将主键返回给调用者,但我不知道如何判断哪个字段包含主键。
答案 0 :(得分:3)
我在通用存储库中有一个通用的InsertOrUpdate方法,它也可以确保创建代理。 (代理需要支持延迟加载,如果使用“new”创建实体,则不会创建代理)。请参阅问题here
public class RepositoryBase<T> : IRepository<T> where T : ModelBase
{
public virtual T InsertOrUpdate(T e)
{
DbSet<T> dbSet = context.Set<T>();
//Generate a proxy type to support lazy loading
T instance = dbSet.Create();
DbEntityEntry<T> entry;
if (e.GetType().Equals(instance.GetType()))
{
//The entity being added is already a proxy type that
//supports lazy loading just get the context entry
entry = context.Entry(e);
}
else
{
//The entity being added has been created using the "new" operator.
//Attach the proxy
//Need to set the ID before attaching or we get
//The property 'ID' is part of the object's key
//information and cannot be modified when we call SetValues
instance.ID = e.ID;
entry = context.Entry(instance);
dbSet.Attach(instance);
//and set it's values to those of the entity
entry.CurrentValues.SetValues(e);
e = instance;
}
entry.State = e.ID == default(int) ?
EntityState.Added :
EntityState.Modified;
return e;
}
}
public abstract class ModelBase
{
public int ID { get; set; }
}
请注意,所有模型都继承了ModelBase,以便处理ID问题并返回实体而不仅仅是ID。这可能不是绝对必要的,因为传入对实体的引用并且EF无论如何都要对ID执行修正,因此您始终可以从传入的引用中访问它。
答案 1 :(得分:1)
这可能依赖于Entity框架上的特定版本,但这就是我的工作方式
public void Create(T entity)
{
using (var db = new DemoWebEntities())
{
db.Set<T>().Add(entity);
}
}
答案 2 :(得分:0)
对于主键问题,您是否可以使用部分类来使您的实体实现接口,如下所示:
public interface IEntity
{
Guid PrimaryKey { get; }
}
您的实体类将返回适当的值:
public partial class EntityType : IEntity
{
public Guid PrimaryKey
{
get
{
return this.WhateverId; // Return the primary key
}
}
}
然后,将您的方法限制为仅接受IEntity:
public class EntityExchange<T, KeyType> where T : IEntity
最后在插入后返回主键:
return t.PrimaryKey;
答案 3 :(得分:0)
可能它可以帮到你。
public T Add(T model)
{
using (BigConceptEntities entity = new BigConceptEntities())
{
entity.Set<T>().Add(model);
entity.SaveChanges();
return model;
}
}