2009-11-24 6 views
2

Я создаю модель сущности, где у меня есть общий базовый объект для большинства других объектов. Например:Как сопоставить базовые объекты в Entity Framework?

Person -> BaseEntity

BaseEntity Id Создано и т.д ...

Person FirstName LastName ЭСТ ...

В соответствующей таблице памяти все столбцы находятся в таблице Person.

Person Id Создано FirstName LastName и т.д ...

Когда я иду на карту свойства сущностей в Person сущности Я хочу, чтобы отобразить столбец Id в таблице Person свойству Id в EntityBase и столбец FirsName для свойства сущности FirstName.

Однако, если вы находитесь в объекте Person и добавляете таблицу Person для сопоставления, вы можете отображать свойства только в объекте Person, а не в унаследованном классе?

Я установил что-то неправильно концептуально?

Благодаря

ответ

1

Я думаю, что вы пытаетесь сделать, это невозможно в EF. Возможно, я ошибаюсь. Я сделал это с реализацией общих свойств путем определения интерфейсов:

public interface ICreationInfo 
{ 
    DateTime CreationDate { get; set; } 
    User CreatedBy { get; set; } 
    EntityReference<User> CreatedByReference { get; set; } 
} 

public interface ILastModificationInfo 
{ 
    DateTime LastModificationDate { get; set; } 
    User LastModificationBy { get; set; } 
    EntityReference<User> LastModificationByReference { get; set; } 
} 

Затем я определил шаблон Т4, чтобы иметь его в каждом классе сущностей:

<#@ template language="C#" #> 
<#@ output extension="cs" #> 
<#@ import namespace="System.Collections.Generic" #> 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Web; 

<# 
    String[] classNames = new String[] {"User","Project","Group","GroupUser","OperationSystem","TaskType","Priority","Severity","Status","Version","Platform","Task","TaskUser","Attachment","Comment","Setting","CustomField"}; 
    List<String> classWithoutModificationInfo = new List<String>(); 
    classWithoutModificationInfo.Add("GroupUser"); 
    classWithoutModificationInfo.Add("TaskUser"); 
    classWithoutModificationInfo.Add("Attachment"); 
#> 
namespace CamelTrap.Models 
{ 
<# foreach(String className in classNames) { #> 
    public partial class <#= className #> : IBasicEntityInfo, ICreationInfo <#= (!classWithoutModificationInfo.Contains(className))?",ILastModificationInfo":"" #> 
    { 

    } 
<# } #> 
} 

Это генерирует код:

public partial class User : IBasicEntityInfo, ICreationInfo, ILastModificationInfo 
{ 

} 
public partial class Project : IBasicEntityInfo, ICreationInfo, ILastModificationInfo 
{ 

} 
public partial class Group : IBasicEntityInfo, ICreationInfo, ILastModificationInfo 
{ 

} 

When Я хочу получить доступ к основным свойствам, проверить интерфейс.

1

Ключ здесь состоит в том, чтобы иметь базовый класс, который не является Объект в концептуальной модели.

Этот подход не поддерживается в EF 1.0 (3.5 SP1) или EF 4.0 Beta 2.

Но в EF 4.0 RTM вы сможете принять классы, как это:

public class Base 
{ 
    public DateTime CreatedDate{get;set;} 
} 
public class Derived:Base 
{ 
    public string SomeProperty {get;set;} 
} 

и карту «Производная» класс на объект, который выглядит, как это в концептуальной модели (случайным образом составлен объект DSL!):

entity Derived{ 
    DateTime CreateDate; 
    string SomeProperty; 
} 

для этого вам нужно будет писать классы самостоятельно (с помощью ПОКО или code- Только) чем позволить EF генерировать их для вас.

Надеется, что это помогает

Alex