EF与非POCO类

时间:2013-09-30 14:59:57

标签: c# entity-framework

我有一个自定义Date类,它包装DateTime对象以仅显示Date部分。

我正在尝试将其包含在实体中,但获得例外:

error 3004: Problem in mapping fragments starting at line 6:No
mapping specified for properties Goal.Date in Set Goal.\r\nAn Entity with Key
(PK) will not round-trip when:\r\n  Entity is type [EFCodeFirstSandbox.Goal]

是什么给出的?如何让我的自定义课程在EF世界中发挥出色?

以下是自定义Date类的简化版本:

public class Date
{
    private DateTime value;
    public Date(DateTime date)
    {
        this.value = date.Date;
    }
    public static implicit operator Date(DateTime date)
    {
        return new Date(date);
    }
    public static implicit operator DateTime(Date date)
    {
        return date.value;
    }
}

使用Date的实体类:

public class Goal
{
    [Key]
    public Guid Id { get; set; }
    public Date Date { get; set; }
    public int Amount { get; set; }
}

编辑:此Date类仅用于说明目的。我很想知道如何映射自定义的非POCO类,而不是如何在SQL中表示日期。 :)

4 个答案:

答案 0 :(得分:1)

事实上,EF说:“我不知道如何使用Date类”。由于Date属性是对另一个类的引用,因此EF希望定义此类之间的关联GoalDate之间的关联。它们都不是。

我会将完整的DateTime属性映射到数据库列,并创建一个计算属性,该属性返回此DateTime属性的日期部分。

例如(如@Excommunicated指出):

partial class Goal
{
    [System.ComponentModel.DataAnnotations.Schema.NotMapped]
    public DateTime DateTrunc
    { 
        get { return this.Date.Date; }
    }        
}

答案 1 :(得分:1)

我不相信你能做你想做的事。您需要使用类型Entity框架知道如何映射。您需要做的是使用DateTime并使用readonly或unmapped属性来公开您的自定义类型。

public class Goal
{
    [Key]
    public Guid Id { get; set; }
    public DateTime Date { get; set; }
    public int Amount { get; set; }

    // Read only field not mapped
    public Date CustomDate { get { return this.Date; }}

    // OR... specificallly ignored property that enables date setting

    [NotMapped] // In System.ComponentModel.DataAnnotations.Schema namespace
    public Date CustomDate { 
                                get { 
                                     return this.Date; 
                                }
                                set {
                                    this.Date = value;
                                }
                           }        
}

答案 2 :(得分:0)

正如@GertArnold所说,将列类型保持为DateTime。添加部分类定义以公开您需要的任何其他属性。

答案 3 :(得分:0)

您获得的错误意味着EF尝试将Date类型解析为表格(与您制作的任何其他类别一样)并且没有类型Date的主键。
您应该使用DateTime并使用[DataType(DataType.Date)]装饰该属性。