使用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个)。我需要你的专长。
答案 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)
: "";
}