2009-07-06 12 views
0

LINQ to SQLで可能となることを望む独自の要件があります。LINQ to SQL:列のエイリアスを使用してエンティティクラスを拡張する方法

まず、古いアプリケーションを拡張しているので、現在のデータベースの列名と既存のLINQエンティティクラスが残っています。

私は、次の方法でLINQラッパーを持っている:

//this is not the exact code 
//it is just to give you an idea 
public parital class Widget { 
    public int WidgetId { get; set; } 
    public string WidgetName { get; set; } 
} 
:(LINQによって生成された)私の既存のエンティティクラスがどのように見える

public interface IEntity { 
    int Id { get; } 
} 

:よう

public T Get(int id) where T : class, IEntity { 
    ... 
} 

IEntityに見えます

私のラッパーでWidgetを動作させるにはIEntityのように拡張しました:

public partial class Widget : IEntity { 
    public int Id { get { return WidgetId; } } 
} 

私は選択などを行います。

Repository<Widget>.Get(123); 

私はIDがSQLにマッピングされていないというエラーを取得します。

私が知りたいことは、ウィジェットにIEntityを作成し、IdをWidgetIdのエイリアスとして使用する方法があることです。 WidgetIdを参照する(リポジトリラッパーなしで)古いコードがたくさんあるので、これを変更する必要はありません。

すべての提案をいただければ幸いです。私はこれについて間違っていますか?

答えて

1

LINQはIdWidgetIdに翻訳することはできません。

O/Rデザイナーでは、必要に応じて列の名前を変更できます。これを行うと、LINQは列名を正しく変換できます。 O/Rデザイナで名前を変更しても、データベースには何の影響もありませんので、完全に安全な操作です。 .designer.csファイルを開き、属性を使用して列名をクラス・プロパティーにマップする方法を参照してください。

+0

最近、データベースの変更からLINK to SQLモデルを更新する正しい方法は、データベース上のすべてのオブジェクトを削除し、データベースから再度コピーすることです。それはこの変化を破壊するだろうか? LINQ to SQLはDBに直接マッピングされますので、これは適切ではないようです。 –

+0

彼が望むことをするために、これはおそらくそれを管理する最も簡単な方法です。はい、データベースを変更してモデルを更新する必要がある場合、彼は変更を再作成する必要があります。しかし、それはあまり頻繁に起こるべきではなく、変更はいずれの場合でも軽微です。 –

+0

これは解決策だと思っていましたが、古いコードではすでにWidgetIdが使用されているため、モデルを変更せずに別の方法があるかどうかを見たいと思っていました。私は少しリファクタリングがあると思う。ありがとう。 – modernzombie

関連する問題