c# – 实体框架6:使用接口作为导航属性可能吗?
发布时间:2020-12-15 04:03:25 所属栏目:百科 来源:网络整理
导读:有没有办法在EF6中使用接口作为导航属性? 我找到了EF4或更早版本的相关主题,似乎不太可能;一般来说,从那时起,继承似乎已经有了很大的改进,但我还没有找到办法使这个特定问题发挥作用. 例: public interface IPerson{ string name { get; set; }}public cla
有没有办法在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>,以及当有人尝试添加/设置任何不从抽象基类继承的对象时,会再次抛出异常.它基本上是一个集合< IPerson>保证只包含继承继承APerson的对象,如果愿意的话. 这个解决方案绝对不是理想的,因为如果某人尝试为不从APerson继承的驱动程序赋值,它只会引发异常,因此这里没有编译时安全性.但是,如果你真的想让你的界面保持独立和独立,那么这是我能想到的最好的解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |