EF Code First - Type类型的属性

时间:2013-04-12 21:20:27

标签: c# ef-code-first

我有一个具有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
    }
}

我将此模型用于异步作业处理系统,该系统工作正常。现在,我正在尝试构建一个调度程序,在那里我可以给它一个作业类型和参数(序列化为字符串)并让它按时间间隔运行。

1 个答案:

答案 0 :(得分:1)

看看我几天前发的这篇文章......

How should I define a field that can take various data types in EF?

你为什么要这样做?

您几乎不需要保存Type

  

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

但我会进一步劝阻你走那条路 - 而是反思。

EF代码首先是关于“强类型”实体。您可以使用良好的“继承”,无需保存类型。

如果你需要有限的#中的“枚举类型” - 使用枚举或int。

您可以发布您的模型,如果可以更改,我会指出您。

<小时/> 我认为你可以使用继承来满足你的需要 制作不同类型的Jobs实体。

e.g。在这里看看这个解决方案(我之前的帖子)
Multiple Inheritance Levels in EF Code Firs
...当你尝试某些事情时,让我知道问题,问题。

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