首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架-确定给定类型的HasDatabaseGeneratedOption设置

实体框架-确定给定类型的HasDatabaseGeneratedOption设置
EN

Stack Overflow用户
提问于 2016-03-23 03:48:58
回答 2查看 810关注 0票数 0

对于我的数据库中的一些属性,我需要手动计算它们的Id #,所以对于这些属性,我在OnModelCreating中执行.Property(p => p.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);

然后,在存储库中,我有一个方法可以计算出给定类型的Id。我更希望系统智能化,并检查DatabaseGeneratedOption.NoneDatabaseGeneratedOption.Identity是否返回下一个Id或0。

如何检查(从存储库内部)给定类型(T)的DatabaseGeneratedOption是什么?

EN

回答 2

Stack Overflow用户

发布于 2016-03-23 08:32:36

多亏了George的评论,我才能想出这样的解决方案:

代码语言:javascript
运行
复制
bool? _sqlGeneratesID;
bool IRepository<TEntity>.IsStoreGeneratedIdentity()
{
    if (!_sqlGeneratesID.HasValue)
    {
        var items = (_context as IObjectContextAdapter)?.ObjectContext.MetadataWorkspace.GetItems(DataSpace.SSpace).OfType<EntityType>();
        var entity = items.Single(x => x.Name == typeof(TEntity).Name);
        _sqlGeneratesID = entity.KeyProperties.FirstOrDefault()?.IsStoreGeneratedIdentity ?? false;
    }

    return _sqlGeneratesID.Value;
}
票数 0
EN

Stack Overflow用户

发布于 2016-03-24 05:51:52

正如我在评论中所说的,您的解决方案是通过从EntityType返回CLR类型名称的代码优先存储模型来工作的。但是,数据库优先的商店模型会返回商店名称。这些名称不一定与CLR类型名称匹配。

要使此方法独立于EF的存储模型,我们需要访问存储- CLR映射空间(CSSpace),找到EntitySet (通过CLR名称),并将其KeyMembers与存储模型(Property.Column)中的列进行匹配,因为这些列包含正确的IsStoreGeneratedIdentity值。(CLR属性也具有此属性,但它始终为false)。

所以这就是我们得到的(作为一个封装在DbContext子类型中的方法):

代码语言:javascript
运行
复制
public bool IsStoreGeneratedIdentity<TEntity>()
{
    var entityContainerMappings = (this as IObjectContextAdapter).ObjectContext
        .MetadataWorkspace.GetItems(DataSpace.CSSpace)
        .OfType<EntityContainerMapping>();

    var entityTypeMappings = entityContainerMappings
        .SelectMany(m => m.EntitySetMappings
            .Where(esm => esm.EntitySet.ElementType.Name == typeof(TEntity).Name))
        .SelectMany(esm => esm.EntityTypeMappings).ToArray();

    var keyMappings = (from km in entityTypeMappings.SelectMany(etm => etm.EntityType.KeyMembers)
        join pm in entityTypeMappings.SelectMany(etm => etm.Fragments)
            .SelectMany(mf => mf.PropertyMappings)
            .OfType<ScalarPropertyMapping>()
            on km.Name equals pm.Property.Name
        select pm
        );

    return keyMappings.Any(pm => pm.Column.IsStoreGeneratedIdentity);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36163841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档