gpt4 book ai didi

c# - Entity Framework 6 : Using interface as navigation properties possible?

转载 作者:太空狗 更新时间:2023-10-29 20:10:04 24 4
gpt4 key购买 nike

有没有办法在 EF6 中使用接口(interface)作为导航属性?我找到了似乎不可能的 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
}

这有可能吗?如果不是,执行此操作的明智方法是什么?

因为目前我没有看到任何方法可以让一个接口(interface)拥有一个类型为其他接口(interface)的可设置属性(例如 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 的类,但也实现了 ICollection ,并在有人尝试添加/设置任何不从抽象基类继承的对象时再次抛出异常。它基本上是一个 Collection ,保证只包含继承 APerson 的对象,如果您愿意的话。

这个解决方案绝对不是理想的,因为如果有人试图为驱动程序分配一个不是从 APerson 继承的值,它只会抛出一个异常,所以这里没有编译时安全。但如果您真的想让您的界面保持独立和独立,这是迄今为止我能想到的最佳解决方案。

关于c# - Entity Framework 6 : Using interface as navigation properties possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25385161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com