1

我有一个自定义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

4 回答 4

1

事实上,英孚说:“我不知道Date上课要做什么”。由于该Date属性是对另一个类的引用,EF 希望定义此类的映射以及Goal与之间的关联Date。他们都不是。

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

例如(正如@Excommunicated 指出的那样):

partial class Goal
{
    [System.ComponentModel.DataAnnotations.Schema.NotMapped]
    public DateTime DateTrunc
    { 
        get { return this.Date.Date; }
    }        
}
于 2013-09-30T15:10:04.183 回答
1

我不相信你能做你所追求的。您需要使用类型实体框架知道如何映射。您需要做的是使用 DateTime 并使用只读或未映射的属性来公开您的自定义类型。

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;
                                }
                           }        
}
于 2013-09-30T16:12:55.770 回答
0

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

于 2013-09-30T15:13:25.400 回答
0

您收到的错误意味着 EF 尝试将Date类型解析为表(就像您创建的任何其他类一样)并且 type 没有主键Date
您应该使用DateTime和装饰该物业[DataType(DataType.Date)]

于 2013-09-30T15:16:39.447 回答