【发布时间】:2021-10-18 21:23:53
【问题描述】:
我有几个想要创建的 EF 模型类。每个类都有一些我想在插入新实体之前设置的公共属性,例如:
public partial class BlogPost {
public DateTime CreatedTime { get; set; }
public string CreatorName { get; set; }
public string PostTitle { get; set; }
public string PostText { get; set; }
}
public partial class Comment {
public DateTime CreatedTime { get; set; }
public string CreatorName { get; set; }
public string CommentText { get; set; }
}
...
当我创建这些类时,我会像这样实例化它们:
var blogPost = new BlogPost {
CreatedTime = DateTime.UtcNow,
CreatorName = creatorName,
PostTitle = postTitle,
PostText = postText,
};
var comment = new Comment {
CreatedTime = DateTime.UtcNow,
CreatorName = creatorName,
...
};
...
我想创建一个方法来自动设置一些常用属性,因此我不需要为每个具有相同属性的类手动输入它们。由于它们不扩展相同的类或实现相同的接口,我想知道如何实现这一点。我的第一个想法是使用通用方法;但是,我不知道是否有一种方法可以指定泛型类型应该具有哪些属性而不扩展同一个类(类似于 TypeScript 的"duck typing")。我想要的方法如下所示:
public void SetInitialProperties<T>(T dbEntity, DateTime createdTime, string creatorName) where T : ??? {
dbEntity.CreatedTime = createdTime;
dbEntity.CreatorName = creatorName;
}
...
var blogPost = new BlogPost { PostTitle = postTitle, PostText = postText };
SetInitialProperties(blogPost, createdTime, creatorName);
如果我不能使用泛型,最坏的情况是,我总是可以使用dynamic;但是,如果可能的话,我想继续进行类型检查。
【问题讨论】:
-
按照您的编码方式,您正在根据何时调用
new来计算“创建时间”。我建议应该在实际创建记录时调用它,这可能会稍晚一些。您可以使用.HasDefaultValueSql("getutcdate()")或SqlDefaultValueAttribute 来实现。 -
你为什么不能为此创建一个额外的接口并让他们实现呢?您可以使用
partial类,这样 EF 就不会覆盖它