2013-09-30 3 views
1

У меня есть пользовательский класс Date, который обертывает объект DateTime, чтобы выставить только часть даты.EF с классом non-POCO

Я пытаюсь включить его в сущности, но получаю исключение:

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; 
    } 
} 

Entity класс с использованием Date:

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

EDIT: Этот Date класс используется только в иллюстративных целях. Мне интересно знать, как сопоставить пользовательские, не-POCO-классы, а не как представлять дату в SQL. :)

ответ

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; } 
    }   
} 
+0

Можете ли вы указать мне на все, что расскажет мне больше о создании вычисленного имущества? – FOO

+1

создать другое свойство в вашем классе Goal, возвращает тип Date и просто вычисляет его из свойства DateTime. Отметьте свойство Date атрибутом [NotMapped] или отметьте его не сопоставленным везде, где вы объявляете свои сопоставления, ключи и отношения и т. Д. – Excommunicated

+0

@Chris См. Мое редактирование. –

0

Как сказал @GertArnold, держать тип столбца, как DateTime. Добавьте определение частичного класса, чтобы выявить любые дополнительные свойства, которые вам нужны.

0

Ошибка, которую вы получаете, означает, что EF пытается разрешить тип Date в таблицу (как и любой другой класс, который вы делаете), и нет первичного ключа для типа Date.
Вы должны использовать DateTime и украсить недвижимость [DataType(DataType.Date)].

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; 
           } 
          }   
} 
Смежные вопросы