C# 如何在Entity Framework 6中获取实体的主键字段和默认值?
我的数据库设计器没有为数据库中的主键字段使用标准的“Id”,因此我需要为我正在编写的通用存储库找到以下内容C# 如何在Entity Framework 6中获取实体的主键字段和默认值?,c#,.net,entity-framework,C#,.net,Entity Framework,我的数据库设计器没有为数据库中的主键字段使用标准的“Id”,因此我需要为我正在编写的通用存储库找到以下内容 主键名 主键CLR类型 主键CLR类型默认值 我正在尝试使用生成的脚手架代码(如下所示)创建一个通用存储库: public void InsertOrUpdate(Entity entity) { if (entity.EntityID == default(int)) { // New entity
- 主键名
- 主键CLR类型
- 主键CLR类型默认值
public void InsertOrUpdate(Entity entity)
{
if (entity.EntityID == default(int))
{
// New entity
_context.Entry(entity).State = System.Data.Entity.EntityState.Added;
}
else
{
// Existing entity (TODO: Wont add the whole graph of things)
_context.Entry(entity).State = System.Data.Entity.EntityState.Modified;
}
}
我通过执行以下操作找到了主键名称:
public string FindPrimaryKey()
{
var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
string keyName = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).FirstOrDefault();
return keyName;
}
公共字符串FindPrimaryKey()
{
var objectSet=((IObjectContextAdapter)_context.ObjectContext.CreateObjectSet();
string keyName=objectSet.EntitySet.ElementType.KeyMembers.Select(k=>k.Name).FirstOrDefault();
返回键名;
}
我即将使用以下代码获得主键CLR类型:
public string FindPrimaryKeyType()
{
var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
string keyType = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.TypeUsage.EdmType.FullName).FirstOrDefault();
var keyType2 = from m in objectSet.EntitySet.ElementType.KeyMembers
select m.TypeUsage.EdmType;
return "";
}
公共字符串FindPrimaryKeyType()
{
var objectSet=((IObjectContextAdapter)_context.ObjectContext.CreateObjectSet();
string keyType=objectSet.EntitySet.ElementType.KeyMembers.Select(k=>k.TypeUsage.EdmType.FullName).FirstOrDefault();
var keyType2=从objectSet.EntitySet.ElementType.KeyMembers中的m开始
选择m.TypeUsage.EdmType;
返回“”;
}
在调试上面的代码时,我可以看到ClrType,但我还没有弄清楚如何从ClrType获取类型:
所以,请帮助我找出如何获取ClrType,或者其他更好的方法 您已经获得了表示属性名称的键名称,只需使用反射来获取属性类型即可
var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
var keyNames = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
以获取默认值
var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
更新
把所有的东西都放在一节课上
public class EntityHelper<Entity> where Entity :class
{
private DbContext _context;
public EntityHelper(DbContext context)
{
_context = context;
}
public string[] FindPrimaryKeyNames()
{
var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
var keyNames = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
return keyNames;
}
public Type[] FindPrimaryKeyTypes()
{
var keyNames = FindPrimaryKeyNames();
var types = keyNames.Select(keyName => typeof(Entity).GetProperty(keyName).PropertyType).ToArray();
return types;
}
public object[] FindPrimaryKeyDefaultValues()
{
var types = FindPrimaryKeyTypes();
var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
return defaultValues;
}
}
公共类EntityHelper,其中实体:类
{
私有DbContext _context;
公共EntityHelper(DbContext上下文)
{
_上下文=上下文;
}
公共字符串[]FindPrimaryKeyNames()
{
var objectSet=((IObjectContextAdapter)_context.ObjectContext.CreateObjectSet();
var keyNames=objectSet.EntitySet.ElementType.KeyMembers.Select(k=>k.Name.ToArray();
返回键名;
}
公共类型[]FindPrimaryKeyTypes()
{
var keyNames=FindPrimaryKeyNames();
var types=keyNames.Select(keyName=>typeof(Entity).GetProperty(keyName).PropertyType.ToArray();
返回类型;
}
公共对象[]FindPrimaryKeyDefaultValues()
{
变量类型=FindPrimaryKeyTypes();
var defaultValues=types.Select(type=>type.IsValueType?Activator.CreateInstance(type):null.ToArray();
返回默认值;
}
}
您已经获得了表示属性名称的键名称,只需使用反射来获取属性类型即可
var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
var keyNames = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
以获取默认值
var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
更新
把所有的东西都放在一节课上
public class EntityHelper<Entity> where Entity :class
{
private DbContext _context;
public EntityHelper(DbContext context)
{
_context = context;
}
public string[] FindPrimaryKeyNames()
{
var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
var keyNames = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
return keyNames;
}
public Type[] FindPrimaryKeyTypes()
{
var keyNames = FindPrimaryKeyNames();
var types = keyNames.Select(keyName => typeof(Entity).GetProperty(keyName).PropertyType).ToArray();
return types;
}
public object[] FindPrimaryKeyDefaultValues()
{
var types = FindPrimaryKeyTypes();
var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
return defaultValues;
}
}
公共类EntityHelper,其中实体:类
{
私有DbContext _context;
公共EntityHelper(DbContext上下文)
{
_上下文=上下文;
}
公共字符串[]FindPrimaryKeyNames()
{
var objectSet=((IObjectContextAdapter)_context.ObjectContext.CreateObjectSet();
var keyNames=objectSet.EntitySet.ElementType.KeyMembers.Select(k=>k.Name.ToArray();
返回键名;
}
公共类型[]FindPrimaryKeyTypes()
{
var keyNames=FindPrimaryKeyNames();
var types=keyNames.Select(keyName=>typeof(Entity).GetProperty(keyName).PropertyType.ToArray();
返回类型;
}
公共对象[]FindPrimaryKeyDefaultValues()
{
变量类型=FindPrimaryKeyTypes();
var defaultValues=types.Select(type=>type.IsValueType?Activator.CreateInstance(type):null.ToArray();
返回默认值;
}
}
我不知道有任何直接方法可以将模型元数据公开的EdmType
映射回本机.Net类型。Yuliam提供了一种混合方法,可以切换到.Net refection来解析该类型
如果您想坚持使用实体框架元数据,您可以自己进行映射,如下面的代码示例所示。这是我的代码,灵感来自以下问题:
要获取类型的默认值,可以使用以下命令。同样,我所使用的代码最初取自以下问题:
然后按如下方式使用:
var objectContext = (context as IObjectContextAdapter).ObjectContext;
var entitySet = objectContext.CreateObjectSet<YOUR_ENTITY>().EntitySet;
var keys = entitySet.ElementType.KeyMembers.Select(k =>
{
var type = GetTypedEdmValue(k.TypeUsage.EdmType);
return new
{
KeyName = k.Name,
KeyType = type,
KeyDefaultValue = GetDefaultValue(type)
};
}).ToList();
var-objectContext=(作为IObjectContextAdapter的上下文);
var entitySet=objectContext.CreateObjectSet().entitySet;
var keys=entitySet.ElementType.KeyMembers.Select(k=>
{
var type=GetTypedEdmValue(k.TypeUsage.EdmType);
还新
{
KeyName=k.Name,
KeyType=类型,
KeyDefaultValue=GetDefaultValue(类型)
};
}).ToList();
这只是为了示例而连接起来的,用于返回带有键名、类型和默认值的匿名类型列表。我不知道有任何直接方法可以将模型元数据公开的EdmType
映射回本机.Net类型。Yuliam提供了一种混合方法,可以切换到.Net refection来解析该类型
var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
如果您想坚持使用实体框架元数据,您可以自己进行映射,如下面的代码示例所示。这是我的代码,灵感来自以下问题:
要获取类型的默认值,可以使用以下命令。同样,我所使用的代码最初取自以下问题:
然后按如下方式使用:
var objectContext = (context as IObjectContextAdapter).ObjectContext;
var entitySet = objectContext.CreateObjectSet<YOUR_ENTITY>().EntitySet;
var keys = entitySet.ElementType.KeyMembers.Select(k =>
{
var type = GetTypedEdmValue(k.TypeUsage.EdmType);
return new
{
KeyName = k.Name,
KeyType = type,
KeyDefaultValue = GetDefaultValue(type)
};
}).ToList();
var-objectContext=(作为IObjectContextAdapter的上下文);
var entitySet=objectContext.CreateObjectSet().entitySet;
var keys=entitySet.ElementType.KeyMembers.Select(k=>
{
var type=GetTypedEdmValue(k.TypeUsage.EdmType);
还新
{
凯恩