2017-06-27 3 views
2

私はEFに移行することを決めたレガシーnHibernteコードを作成しています。私は式マップを使って流暢なマッピングを見つけましたが、これをEF(6. *)で再現したいと思います。私が理解しているように、数式マッピングはEFでは利用できませんが、の簡単なソリューションまたは回避策を提供したいと考えていました。EF相当のnHibernate数式マッピング

簡体エンティティ:

public class Department 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual bool CanChange { get; set; }   
} 

簡体NHibernateは地図:

public DepartmentMap() 
{ 
    Map(x => x.Name); 
    Map(x => x.CanChange) 
     .Formula("(select case when count(*) > 0 then 0 else 1 end from Users where Users.placeid = Id)"); 
} 

答えて

2

データベースを変更することはできますか?

これは(非永続の)Computed Columnの候補のようです。

列を追加して、それを通常のプロパティとしてマップし、読み取り専用としてマークします。

それは

CREATE FUNCTION dbo.getCanChangeDepartment(@placeId int) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @r bit 

    select @r = case when count(0) > 0 then cast(0 as bit) 
    else cast(1 as bit) end 
    from Users 
    where Users.placeid = @placeId 

    RETURN @r 
END 

ALTER TABLE dbo.Department 
    ADD CanChange AS dbo.getCanChangeDepartment(Id) 
+0

私はデータベースを変更すべきではありませんが、私はとにかく行います。私はあなたのアプローチが気に入っており、ORMがデータベースがより良く、より迅速にできることを行う理由はないことに同意します。 – user3213045

+0

はもう1つのアプローチを考えています(下記参照) –

0

別のテーブルを使用してクエリのための関数を作成するために別のアプローチが必要になりますすべての部門を返し、彼らは変更することができるかどうかビューを作成することです。

EFでマップします。

Departmentと1対1の結合関係を作成します。