实体框架中的接口继承

Chr*_*tta 5 entity-framework-4

使用 Entity Framework 4,我想为我的对象创建一个基接口,以便将基接口的属性实现为每个派生类的表中的字段(而不是在其自己的表中),然后使用界面。

例如,有一个接口和一些类,如下所示:

public interface IBaseEntity
{
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
}

public class SomeEntity : IBaseEntity
{
    public int SomeEntityId { get; }
    public string Name { get; set; }
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
}

public class OtherEntity : IBaseEntity
{
    public int OtherEntityId { get; }
    public float Amount { get; set; }
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这将导致数据库中出现两个表:SomeEntity 和 OtherEntity,每个表都有四个字段。SomeEntity 具有 SomeEntityId、Name、CreatedOn 和 CreatedBy,OtherEntity 具有 OtherEntityId、Amount、CreatedOn 和 CreatedBy。没有 IBaseEntity 表。

我希望看到它在设计器中显示为 IBaseEntity 是一个具有 CreatedOn 和 CreatedBy 属性的抽象实体,而两个具体实体仅具有其非派生属性 - 因此 SomeEntity 只有 SomeEntityId 和 Name。具体实体和抽象实体之间存在继承关系。

然后我希望在保存这些对象时自动更新列,如下所示:

namespace MyModel
{

    public partial class MyEntities
    {
        partial void OnContextCreated()
        {
            this.SavingChanges += new EventHandler(OnSavingChanges);
        }

        private static void OnSavingChanges(object sender, EventArgs e)
        {
            var stateManager = ((MyEntities)sender).ObjectStateManager;
            var insertedEntities = stateManager.GetObjectStateEntries(EntityState.Added);

            foreach (ObjectStateEntry stateEntryEntity in insertedEntities)
            {
                if (stateEntryEntity.Entity is IBaseEntity)
                {
                    IBaseEntity ent = (IBaseEntity)stateEntryEntity.Entity;
                    ent.CreatedBy = HttpContext.Current.User.Identity.Name;
                    ent.CreatedOn = DateTime.Now;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我刚刚开始使用实体框架,看起来这应该能够相当容易地完成,但如何实际实现它却让我无法理解。我是否偏离了轨道,或者这种事情在 Entity Framework 4 中可能发生吗?每个具体类型策略的表似乎是解决方案,但我无法使其发挥作用。

Cra*_*ntz 3

该界面不会成为实体模型的一部分,并且无法显示在设计器中。但是您可以通过分部类添加它,然后您的代码就可以工作了。我们实际上为此使用了 T4 模板,但手动完成时也能正常工作。