【发布时间】:2012-03-21 13:12:09
【问题描述】:
我有以下实体:
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
{
[Key]
public virtual int Id { get; set; }
public virtual int IntValue { get; set; }
}
我想使用 EF CodeFirst 来访问数据库并创建数据库架构。但是 CodeFirst 不允许对实体之间的关系使用接口类型。因此它不会在 MyEntity 和 MyDetail 之间创建关系。我无法更改接口,因此我无法将属性类型更改为 MyDetail 而不是 IMyDetail。但是我知道这个模型的客户端只会使用每个接口的一个实现。
我找到了 IMyDetail 类型属性的解决方法。我可以创建一个 MyDetail 类型的属性并显式实现接口的属性:
private MyDetail _myDetail;
public virtual MyDetail MyDetail
{
get
{
return this._myDetail;
}
set
{
this._myDetail = value;
}
}
IMyDetail IMyEntity.MyDetail
{
get
{
return this._myDetail;
}
set
{
this._myDetail = (MyDetail)value;
}
}
它工作正常。但此解决方案不适用于 ICollection<IMyDetail>,因为我无法将其转换为 ICollection<MyDetail>。
有解决办法吗?
【问题讨论】:
-
EF 不支持接口,所以不要在模型中使用它们或不要使用 EF。
-
我知道。但我必须使用它们。所以,我尝试做一个解决方法。我希望有人帮助我:)
-
@LadislavMrnka 对于我的一生,我在 EF 官方网站或各种开发人员博客上找不到列出 EF 中不支持的所有属性类型的单个列表(接口,版本 5 之前的枚举, ETC...)。你知道我可以参考的这样一份清单吗?
-
Ladislavs 上面的评论不正确。在模型中使用接口是非常可取的。即使 EF 不支持,您也可以使用它们。请参阅此处找到的 Bogeys 答案:stackoverflow.com/questions/25385161/…
-
您可以使用 Linq 将集合与以下接口相互转换: IEnumerable
IMyEntity.MyDetails { get { return MyDetails.Select(i => i as IMyDetail); } set { MyDetails = (ICollection )value.Select(i => i as MyDetail); } }
标签: entity-framework