我有以下实体:
public interface IMyEntity
{
[Key]
int Id { get; set; }
IMyDetail MyDetail { get; set; }
ICollection<IMyDetail> CollectionOfReferences { get; set; }
}
public interface IMyDetail
{
[Key]
int Id { get; set; }
int IntValue { get; set; }
}
public class MyEntity : IMyEntity
{
[Key]
public virtual int Id { get; set; }
public virtual IMyDetail MyDetail { get; set; }
public virtual ICollection<IMyDetail> CollectionOfReferences { get; set; }
}
public class MyDetail : IMyDetail …Run Code Online (Sandbox Code Playgroud) 我Foo在实体框架中有一个实体.但我正在使它继承,IFoo以便我的业务逻辑只知道IFoo- 从而抽象出实体框架.
问题是Foo有一组Bar实体.而这个系列是类型的EntityCollection<Bar>.
如果我按IFoo原样放入此集合,我IFoo依赖于Entity Framework.所以我想把它作为ICollection<IBar>,但这不编译(自然).
我能想到的唯一的解决办法就是去具体的Foo实体框架设计器生成的执行情况和更改收集EntityCollection<Bar>到ICollection<IBar>那里.但我担心这会对"幕后"的实体框架产生影响.
有没有什么办法让我可以定义IFoo并IBar独立于实体框架,同时仍然维护Foo和Bar实现它们的EF实体?做IFoo和IBar甚至是有意义的,如果我不能做到这一点的独立性,我什么为目标?
有没有办法在EF6中使用接口作为导航属性?我找到了EF4或更早版本的相关主题,似乎不太可能; 一般来说,从那时起,继承似乎已经有了很大的改进,但我还没有找到办法使这个特定问题发挥作用.
例:
public interface IPerson
{
string name { get; set; }
}
public class Man : IPerson { /* ... */ }
public class Woman : IPerson { /* ... */ }
public interface ICar
{
IPerson driver { get; set; }
}
public class Car : ICar
{
public virtual IPerson driver { get; set; } // This won't map
}
Run Code Online (Sandbox Code Playgroud)
这有可能吗?如果没有,那么做什么是明智的方法呢?
因为目前我没有看到任何方式让接口有一个可设置的属性,其类型是其他接口(例如ICar的IPerson属性),哪种打击我作为一个非常严重的设计限制?!
回到 EF 4,这是不可能的。是否可以DbSet在 EF6 或 EF Core 中使用接口?
public class LfSp3Ctx : DbContext, ILfSp3Ctx
{
public DbSet<ILfSp3Project> ProjectSE { get; set; }
}
Run Code Online (Sandbox Code Playgroud)