【问题标题】:Updating From Database Causes Redoing The Inheritance从数据库更新导致重做继承
【发布时间】:2013-12-27 09:14:31
【问题描述】:

使用 EF 5。下面是 Model.tt 下的 Model.cs 文件 有人建议我有一个接口,由于某种原因,模型上的所有实体都可以继承这个接口。你在下面看到他们两个(地址,孩子)。

public interface IHasAutoID
{
    int getAutoId();
}

public partial class Adress : IHasAutoID
{
    public int ID { get; set; }
    public Nullable<System.DateTime> date{ get; set; }
    ..
    ..
}

public partial class Kids : IHasAutoID
{
    public int ID { get; set; }
    public Nullable<System.DateTime> date { get; set; }
    ..
}

每当我“从数据库更新模型”时,由于“表”不可选择(我不知道为什么),我需要删除整个模型并创建与数据库的新连接。完全没有问题。但这会导致接口继承丢失。每次我需要从“IHasAutoID”接口继承所有实体(近 50 个)时。我需要你的专业知识。

【问题讨论】:

    标签: asp.net entity-framework inheritance


    【解决方案1】:

    您可以创建单独包含您的自定义的部分类。我就是这样做的(假设每个班级都有public int ID):

    public interface IHasAutoID
    {
        int ID { get; set; }
        int GetAutoId();
    }
    
    
    public partial class Address : IHasAutoID
    {
        public int GetAutoId()
        {
             return this.ID;
        }
    }
    

    请注意,这是一个 EF 生成的 Address 类旁边的类。通过使用接口,您必须在每个部分类中实现GetAutoId()。另一种方法是在抽象基类中执行此操作。就个人而言,尽管样板代码量较大,但我更喜欢接口。继承通常会使代码变得过于复杂。

    第三种选择是修改 t4 模板以在生成的代码中包含接口及其实现。这不是太难。 (但通常需要反复试验)。

    最后一条评论:您显然希望获得生成的 ID 值。但是这些值在EF执行SaveChanges后返回到新实体中,也许你甚至不需要这个接口?

    【讨论】:

      【解决方案2】:

      修改模型.tt

          public string EntityClassOpening(EntityType entity)
      {
          return string.Format(
              CultureInfo.InvariantCulture,
              "{0} {1}partial class {2}{3} : IHasAutoID",
              Accessibility.ForType(entity),
              _code.SpaceAfter(_code.AbstractOption(entity)),
              _code.Escape(entity),
              _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
      }
      

      添加 IHasAutoID 的命名空间

          public string UsingDirectives(bool inHeader, bool includeCollections = true)
      {
          return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion())
              ? string.Format(
                  CultureInfo.InvariantCulture,
                  "{0}using System;{1}" +
                  "{2}using YourNamespace of IHasAutoID;",
                  inHeader ? Environment.NewLine : "",
                  includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "",
                  inHeader ? "" : Environment.NewLine)
              : "";
      }
      

      【讨论】:

        猜你喜欢
        • 2014-02-21
        • 1970-01-01
        • 2010-09-05
        • 2012-06-30
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        相关资源
        最近更新 更多