从数据库更新导致重做继承

时间:2013-12-27 09:14:31

标签: asp.net entity-framework inheritance

使用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个)。我需要你的专长。

2 个答案:

答案 0 :(得分:1)

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

public interface IHasAutoID
{
    int ID { get; set; }
    int GetAutoId();
}


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

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

第三种方法是修改t4模板,使其包含接口及其在生成的代码中的实现。这不是太难。 (但通常需要一些试验和错误)。

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

答案 1 :(得分:0)

修改Model.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)
        : "";
}