EF代码优先- type类型的属性

本文关键字:类型 属性 type 代码 EF | 更新日期: 2023-09-27 18:08:49

我有一个属性类型为type的对象:

public ScheduledJob
{
    public int ID { get; set; }
    public Type JobType { get; set; }
    public string JobParameters { get; set; }
}
当我生成代码优先迁移时,我得到以下错误:
System.ArgumentNullException: Value cannot be null.
Parameter name: key
    at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
    at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
    at System.Data.Entity.ModelConfiguration.Configuration.Mapping.SortedEntityTypeIndex.Add(EdmEntitySet entitySet, EdmEntityType entityType)
    at System.Data.Entity.ModelConfiguration.Configuration.Mapping.EntityMappingService.Analyze()
    at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.ConfigureEntityTypes(DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
    at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.Configure(DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
    at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
    at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
    at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
    at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
    at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
    at System.Data.Entity.Internal.LazyInternalContext.get_CodeFirstModel()
    at System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(DbContext context, XmlWriter writer)
    at System.Data.Entity.Migrations.Extensions.DbContextExtensions.<>c__DisplayClass1.<GetModel>b__0(XmlWriter w)
    at System.Data.Entity.Migrations.Extensions.DbContextExtensions.GetModel(Action`1 writeXml)
    at System.Data.Entity.Migrations.Extensions.DbContextExtensions.GetModel(DbContext context)
    at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext)
    at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration)
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator()
    at System.Data.Entity.Migrations.Design.ToolingFacade.GetPendingMigrationsRunner.RunCore()
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()

让这个场景工作的最好方法是什么?

编辑@NSGaga的帖子:

整个模型(简化)如下:

所有作业对象实现以下接口:

public interface IJob
{
    Guid ID { get; set; }
    void Run();
}

每个作业都有自己的属性作为参数:

public class ProcessMedia : IJob
{
    public Guid ID { get; set; }
    public int MediaContentID { get; set; }
    public void Run()
    {
        if(MediaContentID <= 0)
             throw new Exception("Missing parameter MediaContentID");
        //work
    }
}
我将此模型用于异步作业处理系统,它工作得很好。现在,我正在尝试构建一个调度器,在那里我可以给它一个作业类型和参数(序列化为字符串),并让它运行的间隔。

EF代码优先- type类型的属性

看看我几天前写的这篇文章…

我应该如何定义一个字段,可以采取各种数据类型在EF?

你为什么要这样做?

您几乎不需要这样保存Type

@David已经提到该怎么做了。

但我更不鼓励你那样做——而是重新考虑。

EF代码首先是关于拥有"强类型"实体。你可以有很好的"继承"工作,而不需要保存类型。

如果您需要从有限的#中获得类似"enum类型"的东西-使用enum或int类型。

你可以把你的模型贴出来,如果可以修改我会告诉你的。


我认为你可以用继承来满足你的需要。
创建不同类型的Jobs实体。

。看看这个解决方案(我之前的帖子)
EF代码优先的多重继承层次
…如果你在尝试的时候遇到问题,请告诉我。

也许使用TPH更容易(就像它在那里),它们都存储在同一个表中-并且您通常会遇到更少的问题。