Entity framework 是否可以实现IDbSet<;T>;F#中的接口?
我正在尝试对进行模拟实现,而我恰好是在F#中进行的 当我尝试使用示例F#签名时,会出现各种语法错误,这并不让我感到惊讶,因为该签名看起来甚至不像有效的F#Entity framework 是否可以实现IDbSet<;T>;F#中的接口?,entity-framework,f#,Entity Framework,F#,我正在尝试对进行模拟实现,而我恰好是在F#中进行的 当我尝试使用示例F#签名时,会出现各种语法错误,这并不让我感到惊讶,因为该签名看起来甚至不像有效的F# 我真的不确定如何处理这些错误消息,或者如何编写约束以满足接口和F#编译器。我开始怀疑是否有可能用这种特殊的微软编程语言实现这种特殊的微软界面。欢迎任何建议。方法Create需要两个泛型类型参数之间的子类型约束。恐怕无法基于F#中的另一个子类型约束向泛型类型参数添加子类型约束。它们总是假定相等,请参见表单类型的新约束:>'b作为type='b再
我真的不确定如何处理这些错误消息,或者如何编写约束以满足接口和F#编译器。我开始怀疑是否有可能用这种特殊的微软编程语言实现这种特殊的微软界面。欢迎任何建议。方法
Create
需要两个泛型类型参数之间的子类型约束。恐怕无法基于F#中的另一个子类型约束向泛型类型参数添加子类型约束。它们总是假定相等,请参见表单类型的新约束:>'b作为type='b再次求解
请参阅与类似问题相关的内容
我们应该要求在下一个F#版本中加入该功能。一开始我对此非常失望。在某些方面我仍然是,但在EF6中有一个解决方法。您可以继承
DbSet)=
继承数据库集(项目)
let query=data.AsQueryable()
new()=FakeDbSet(Seq.empty)
覆盖添加(项:'tenty)=数据添加(项);项目
覆盖_uuu.Remove(项:'tenty)=数据。移除(项)|>忽略;项目
覆盖附加(项:'tenty)=数据添加(项);项目
用
成员_uu.GetEnumerator()=数据.GetEnumerator():>System.Collections.Generic.IEnumerator
接口System.Collections.IEnumerable与
成员_uu.GetEnumerator()=数据.GetEnumerator():>System.Collections.IEnumerator
界面易读
成员u uu.Expression=query.Expression
成员_u.Provider=query.Provider
我不认为UserVoice建议是完全相关的-虽然裸约束是解决F#缺乏通用{co,contra}差异的一种方法,但它们确实是一种不同的功能,在不添加裸约束的情况下添加通用差异并不能解决此问题。@kvb我同意,这是相关的,但我们要么重新制定,要么单独提出建议。即使我们没有co/contra方差,我也希望能够添加这种约束。你认为呢?是的,在这里创建一个涵盖实际场景的新功能请求是绝对有意义的。这很少见,但有些库无法从F#使用,而且没有解决办法,这是一个巨大的痛苦。
type MockDbSet<'T when 'T : not struct>(items:seq<'T>) =
let collection = ResizeArray(items)
new () = MockDbSet(Seq.empty)
interface IDbSet<'T> with
member x.Add entity = collection.Add entity; entity
member x.Attach entity = collection.Add entity; entity
member x.Remove entity = collection.Remove entity |> ignore; entity
member x.Create() = Unchecked.defaultof<'T>
member x.Create<'TD when 'TD : not struct and 'TD :> 'T>() = Unchecked.defaultof<'TD>
member x.Find([<ParamArray>] values) = raise <| NotImplementedException()
member x.Local = Collections.ObjectModel.ObservableCollection(collection)
interface System.Collections.Generic.IEnumerable<'T> with
member x.GetEnumerator() =
collection.GetEnumerator() :> System.Collections.Generic.IEnumerator<_>
interface System.Collections.IEnumerable with
member x.GetEnumerator() =
collection.GetEnumerator() :> System.Collections.IEnumerator
interface IQueryable<'T> with
member x.ElementType = typeof<'T>
member x.Expression =
collection.AsQueryable().Expression
member x.Provider =
collection.AsQueryable().Provider
member x.Create<'TD when 'TD : not struct and 'TD :> 'T>() = Unchecked.defaultof<'TD>
TDerivedEntity Create<TDerivedEntity>()
where TDerivedEntity : class, TEntity
abstract Create : unit -> 'TDerivedEntity when 'TDerivedEntity : not struct and 'TEntity
type FakeDbSet<'TEntity when 'TEntity : not struct>(items: seq<'TEntity>) =
inherit DbSet<'TEntity>()
let data = ObservableCollection<'TEntity>(items)
let query = data.AsQueryable()
new() = FakeDbSet(Seq.empty)
override __.Add(item: 'TEntity) = data.Add(item); item
override __.Remove(item: 'TEntity) = data.Remove(item) |> ignore; item
override __.Attach(item: 'TEntity) = data.Add(item); item
override __.Create() = Activator.CreateInstance<'TEntity>()
override __.Local with get() = data
interface System.Collections.Generic.IEnumerable<'TEntity> with
member __.GetEnumerator() = data.GetEnumerator() :> System.Collections.Generic.IEnumerator<_>
interface System.Collections.IEnumerable with
member __.GetEnumerator() = data.GetEnumerator() :> System.Collections.IEnumerator
interface IQueryable<'TEntity> with
member __.ElementType = typeof<'TEntity>
member __.Expression = query.Expression
member __.Provider = query.Provider