【问题标题】:Entity Framework - inheriting from model实体框架 - 从模型继承
【发布时间】:2017-09-04 00:29:02
【问题描述】:

我是 Entity Framework 的新手,我按照在线教程创建了我的 SQL Server 数据库,并制作了几个模型和一个上下文类来包含访问它们的属性。

这是我的帐户模型:

public class Account
{
    public int ID { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

这是我的上下文类:

 public class DashContext : DbContext
{
    public DashContext()
    : base(Constants.ConnectionString)
    {
        this.Configuration.LazyLoadingEnabled = true;
        this.Configuration.ProxyCreationEnabled = false;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<DashContext>(null);
    }

    public DbSet<Account> Accounts { get; set; }
}

这可行 - 当我访问 DbSet 属性时,我可以访问我的数据库中的所有帐户。

但是,我想创建一个 Account 类的实现,它包含的属性不仅仅是列,因为它必须与我的程序交互。

所以,我尝试执行以下操作:

public class GameAccount : Account
{
    public int SomeSpecialProperty { get; set; }
}

但是,当我使用上下文类获取Account 对象时,我不确定如何将其转换为GameAccount。我知道我可以创建一个构造函数,将属性从Account 复制到GameAccount,如下所示:

public class GameAccount
{
    public int ID { get; private set; }
    public string Username { get; private set; }
    public string Password { get; private set; }

    public GameAccount(Account model)
    {
        this.ID = model.ID;
        this.Username = model.Username;
        this.Password = model.Password;
    }
}

...但这对我来说似乎有点低效,我相信还有更简单的方法。

你怎么看?

【问题讨论】:

  • 在上下文中创建另一个属性,例如public DbSet&lt;GameAccount&gt; GameAccounts {get;set;},然后您将拥有所有这些行。
  • @dcg 这是不正确的。实体框架将尝试查询名为“GameAccount”的表。

标签: c# entity-framework


【解决方案1】:

Copy Constructors 的开发和维护成本可能非常高。通常生成的实体框架类是部分的。

BradleyDotNET 解释:

何时生成代码;你不希望你的额外方法/属性/任何东西被吹走,所以设计者将这些类标记为部分,以允许用户将额外的代码放在不同的文件中。

所以一种可能的方法是扩展类

public partial class Account
{
    public int ID { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

具有其他属性,例如

public partial class Account
{
    public int SomeSpecialProperty { get; set; }
}

【讨论】:

  • 你几乎是对的。但是在这种情况下没有代码生成,因为它是代码优先的方法。
  • @CodingYoshi 是的,但他只是从生成的代码中给出示例。这可能是我的解决方案 - 但是让我的类分开并且仍然指定相同的命名空间似乎有点奇怪。我不能使用不同的命名空间吗?
  • @GilbertWilliams 不,部分类必须写在同一个命名空间中(看看stackoverflow.com/questions/4504288/…
【解决方案2】:

你有几个选择:

选项 1

使用 Fruchtzwerg 指示的 partial 类。

选项 2

您可以使用AutoMapper 将项目从一种类型映射到另一种类型。这是一个例子:

// Notice the ReverseMap call. That will allow mapping in both directions.
Mapper.Initialize(cfg => 
    cfg.CreateMap<Account, GameAccount>().ReverseMap());
var account = Mapper.Map<Account>(new GameAccount());
var gameAccount = Mapper.Map<GameAccount>(account);

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 2016-03-26
    • 2011-05-19
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多