[英]Entity Framework 6: Using interface as navigation properties possible?
有没有办法在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
}
这有可能吗? 如果没有,那么做什么是明智的方法呢?
因为目前我没有看到任何方式让接口有一个可设置的属性,其类型是其他接口(例如ICar的IPerson属性),哪种打击我作为一个非常严重的设计限制?!
好的,对于那些可能在未来面临同样问题的人。 经过更多的测试,这就是我现在正在做的事情。
public interface IPerson
{
string name { get; set; }
}
public abstract class APerson : IPerson
{
public string name { get; set; }
}
public class Man : APerson { /* ... */ }
public class Woman : APerson { /* ... */ }
public interface ICar
{
IPerson driver { get; set; }
}
public class Car : ICar
{
// This maps to the database
public virtual APerson driver { get; set; }
// And this implements the interface
ICar.driver
{
get
{
return (IPerson)driver;
}
set
{
if(!(value is APerson))
throw new InvalidCastException("driver must inherit from APerson");
driver = (APerson)value;
}
}
}
当具有一对多/多对多关系时,这会变得有点棘手,对于这种情况,我编写了一个继承自Collection <Interface type>的类,但也实现了ICollection <Abstract base type>,以及当有人尝试添加/设置任何不从抽象基类继承的对象时,会再次抛出异常。 它基本上是一个Collection <IPerson>,它保证只包含继承继承APerson的对象,如果你愿意的话。
这个解决方案绝对不是理想的,因为如果有人尝试为不从APerson继承的驱动程序赋值,它只会引发异常,因此这里没有编译时安全性。 但是,如果你真的想让你的界面保持独立和独立,那么这是我能想到的最好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.