我有一个自定义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中表示日期。 :)
答案 0 :(得分:1)
事实上,EF说:“我不知道如何使用Date
类”。由于Date
属性是对另一个类的引用,因此EF希望定义此类和之间的关联Goal
和Date
之间的关联。它们都不是。
我会将完整的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)]
装饰该属性。