EF代码首先列出<datetime>而不创建表</datetime>

时间:2011-11-30 20:00:49

标签: c# .net entity-framework-4 code-first

我正在用一个实体创建一个非常简单的EF4代码第一个项目。

public class Activity
{
    public Guid Id { get; set; }
    public string Description { get; set; }
    public List<DateTime> DateDone { get; set; }
    <snip>

    public Activity()
    {
        if(DateDone==null)
            DateDone = new List<DateTime>();
    }
}

我重建我的项目,然后运行MVC3应用程序并生成数据库(确认,我已添加和删除了列),我的数据是种子(当我修改种子数据时,它会在屏幕上更改)

我能够:

var activity = db.Activities.Find(id);
activity.DateDone = DateTime.Now;
db.SaveChanges();

但数据未保存。我检查了数据库,因为只有一个表(Activity),它有所有相应的字段。我希望它应该有第二个表,ActivityDateDone有两个字段,ActivityGuid&amp; DateDone。

我在做这项工作时缺少什么?

3 个答案:

答案 0 :(得分:6)

实体框架不支持基本类型的集合。

您需要定义一个单独的类来保存DateTimes。

答案 1 :(得分:2)

DateTime不是实体。如果希望代码首先为您创建数据结构,则需要创建模型类。我假设您的活动表有一个DateDone列?

答案 2 :(得分:0)

虽然Entity Framework本身不支持此功能,但您可以使其工作得非常好。

请参阅此答案,了解附加代码(PersistableScalarCollection)和原创意见:https://stackoverflow.com/a/11990836/1742393

/// <summary>
///     ALlows persisting of a simple DateTime collection.
/// </summary>
[ComplexType]
public class PersistableDateTimeCollection : PersistableScalarCollection<DateTime>
{
    protected override DateTime ConvertSingleValueToRuntime(string rawValue)
    {
        return DateTime.Parse(rawValue);
    }

    protected override string ConvertSingleValueToPersistable(DateTime value)
    {
        return value.ToShortDateString();
    }
}