松耦合需要一点点的帮助,请如果任何人可以在此提供一些线索。实体框架4.1的实体
我创建这是我工作的罚款代码优先MVC 3应用程序。我现在正在重构,以尽可能多地去除耦合,因为我希望稍后在其他各种MVC 3应用程序中使用该域模型。我现在拥有的是一组实体,它们通过规范化数据库持久化,并通过存储库模式进行CRUD编辑。我已经通过控制器的构造函数使用Ninject将DI存储到DI中,并且正在使用MVC 3项目中的模型来充当DAO。
因此,域内我有一个名为实体案例,有一个外键的另一种情况客户,看起来像这样:
public class Case : ICase
{
[Key]
public int CaseId { get; set; }
public string CaseName { get; set; }
public DateTime DateCreated { get; set; }
public IClient Client { get; set; }
}
然后,我有一个接口(接口主要存在将其实现到视图模型添加我的数据注释 - 我知道我可以将注释添加到域对象,但正如我所说我想要在其他应用程序中使用此域模型将具有不同的无处不在的语言。
public interface ICase
{
int CaseId { get; set; }
string CaseName { get; set; }
DateTime DateCreated { get; set; }
IClient Client { get; set; }
}
然后我在MVC 3项目中有我的视图模型。
public class CaseModel : ICase
{
[HiddenInput(DisplayValue = false)]
int CaseId { get; set; }
[Required(AllowEmptyStrings = false)]
[MaxLength(100)]
string CaseName { get; set; }
[RegularExpression("")]
DateTime DateCreated { get; set; }
IClient Client { get; set; }
}
所以,我的第一个问题是:改变了我的外键引用为客户到IClient是一个新事物,它返回一个空的对象。当类型是一个具体的类时,它返回正常 - 我假设这是因为EF4.1试图创建一个实例IClient。我在这里完全错误还是有办法解决这个问题?
我(可能否定我的第一个问题)第二个问题是我我也做错了通过添加数据注解视图模型继承我的域实体的接口?我应该使用模型元数据吗?如果是这样,我该如何使用元数据,以便我可以在不触及域的情况下使每个项目的数据注释都是唯一的?
谢谢!
只是为了澄清为什么解决第二个问题可能会否定我的第一个问题。这些接口存在的唯一原因是视图模型具有类似于域实体的结构。如果有一种更好的方法来将注释的元数据添加到驻留在不同程序集中的域实体中,那么这些接口不需要存在。我可以删除它们并返回使用我的域实体的具体版本。 –
您不能在实体中使用接口作为导航引用。这就像在属性上放置一个'[NotMapped]'属性,EF简单地忽略了这个属性。你必须有一个具体的或抽象的类。仅用于集合,您可以使用像'ICollection'这样的接口。另一方面'T'必须再次成为一个班级,而不是一个界面。对于标准收集接口,EF具有默认规则,如何实例化它们:“ICollection - > HashSet '或'IList - > List '等。对于您定制的自定义接口,EF没有这样的规则,并且不知道如何实例化这些。 –
Slauma
顺便说一下,EF现在高达4.2。 – TrueWill