代码优先- EntityType '编译结果'没有定义键.定义这个EntityType的键

本文关键字:定义 EntityType 的键 编译 代码 结果 | 更新日期: 2023-09-27 18:04:27

完整错误:

{"在模型生成过程中检测到一个或多个验证错误:'r'n'r'nContentManager。CompilerResults:: EntityType 'CompilerResults'没有定义键。定义这个EntityType的键。'r'nCompilerResults: EntityType: EntitySet 'CompilerResults'基于类型'CompilerResults',没有定义键。'r'n"}

这真是一个奇怪的错误。首先,我没有类称为CompilerResults在该命名空间(ContentManager.CompilerResults)。其次,没有"EntityType 'CompilerResults'"。下面是我创建的名为"ContextEntityPair"的实体类:

[Table("context_entity_pair")]
public class ContextEntityPair
{
    [Column("id")]
    [Key]
    public Guid Id
    {
        get;
        set;
    }
    [Column("context_name")]
    public string ContextName { get; set; }
    [Column("entity_compiler_results")]
    public CompilerResults EntityCompilerResults { get; set; }
    public ContextEntityPair(Guid id, string contextName, CompilerResults entityCompilerResults)
    {
        this.Id = id;
        this.ContextName = contextName;
        this.EntityCompilerResults = entityCompilerResults;
    }
}

我觉得我正在尽我所能来避免'no key defined'错误。我使用名称"Id",将其设置为属性,甚至给它一个[Key]属性。但由于某种原因,它没有给出Id不是键的错误。它说'CompilerResults'没有键,这是没有意义的。下面是我为它设置的上下文:

namespace Laserfiche.BusinessEntities.ContentManager.ReadStore.EF
{
    public class EntityCompilerResultsContext : DbContext
    {
        public EntityCompilerResultsContext()
            : base("EFEntityCompilerResults")
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<EntityCompilerResultsContext>());
        }
        public DbSet<ContextEntityPair> ContextEntityPairs { get; set; }
    }
}

我正在使用一些CRUD方法的存储库。下面是它的开头,插入方法是一个示例方法:

public class EntityContextRepository
{
    private readonly Type _entityType;
    private EntityCompilerResultsContext _db = new EntityCompilerResultsContext();
    public EntityContextRepository()
    {
        _entityType = typeof(ContextEntityPair);
    }
    public async Task InsertAsync(ContextEntityPair pair)
    {
        try
        {
            Ensure.IsNotNull(pair, "pair");
            _db.ContextEntityPairs.Add(pair);
            await _db.SaveChangesAsync();
        }
        catch (DbEntityValidationException dbEx)
        {
            DbEntityValidationExceptionHandle(dbEx);
        }
    }
}

最后这里是我正在运行的测试代码(有一些CodeDOM的东西——忽略它。重要的部分是我定义'entityResults1'和'contextName'及以下的所有内容的地方):

string entityName = "Curtain";
EntityGenerator.EntityFieldInfo entityField1 = new EntityGenerator.EntityFieldInfo("Color", typeof(string), RelationshipType.NoRelation);
EntityGenerator.EntityFieldInfo entityField2 = new EntityGenerator.EntityFieldInfo("Size", typeof(int), RelationshipType.NoRelation);
ICollection<EntityGenerator.EntityFieldInfo> listOfProps = new List<EntityGenerator.EntityFieldInfo> { entityField1, entityField2 };
EntityGenerator.CreateEntityClass(listOfProps, entityName);
CompilerResults entityResults1 = EntityGenerator.GetCompiledEntity(entityName);
GenericEntity entityInstance1 = (GenericEntity) EntityGenerator.CreateInstanceOfEntity(entityResults1, entityName);
SetObjectField(entityInstance1, "Color", "Green");
SetObjectField(entityInstance1, "Size", 20);
string contextName = "EFEntityTest_v1";
Guid testGuid1 = new Guid("00000000000000000000000000000001");
ContextEntityPair entityCompilerResultsPair = new ContextEntityPair(testGuid1, contextName, entityResults1);
EntityContextRepository contextEntityRepo = new EntityContextRepository();
contextEntityRepo.InsertAsync(entityCompilerResultsPair).Wait();

它在InsertAsync中中断:

_db.ContextEntityPairs.Add(pair);

代码优先- EntityType '编译结果'没有定义键.定义这个EntityType的键

你的public CompilerResults EntityCompilerResults { get; set; }没有标记ComplexType属性,它既不是标量属性,也不是引用。你期望它表现如何?