У меня есть следующие объекты:
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>
.
Существуют ли какие-либо решения для этого?