2010-09-14 93 views
2

有沒有辦法在DataContext/DBML文件中定義以下結構?是否可以在LINQ-to-SQL映射中使用泛型?

public class Entity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public EntitySet<IPermission> Permissions { get; set; } 
} 

public class User : IPermissionHolder 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public EntitySet<Permission<User>> Permissions { get; set; } 
} 

public class Group : IPermissionHolder 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public EntitySet<Permission<Group>> Permissions { get; set; } 
} 

public interface IPermissionHolder 
{ 
    int Id { get; set; } 
} 

public interface IPermission 
{ 
    Entity Entity { get; set; } 
    IPermissionHolder Holder { get; } 
} 

public class Permission<T> : IPermission where T : class, IPermissionHolder 
{ 
    public IPermissionHolder Holder 
    { 
     get { return PermissionHolder; } 
    } 

    public T PermissionHolder { get; set; } 
    public Entity Entity { get; set; } 
} 

如果這是不可能的,你能分割出適合我需要的另一種結構嗎?

現在我的數據庫爲GroupPermissions和UserPermissions使用了兩個不同的表。
我不喜歡有一個公共表,我必須添加一個「類型」列...有兩個不同的表我有一個更嚴格的控制數據庫端。

感謝所有幫助

PS:我還是用框架3.5,否則我可以刪除IPermissionHolder界面,並使用協方差

PSS:問也在這裏,但沒有答案:( http://social.msdn.microsoft.com/Forums/en/linqtosql/thread/04a03c68-79c0-4136-907c-f81440e78c45

編輯: 我想要不同的東西,我面臨兩個主要問題 1)我想有一個IEnumerable的,但它永遠不會起作用,因爲我不只是想獲取數據,而且推動數據和一個對象不能同時協變和逆變。所以首先我應該選擇:讀或寫。 2)這裏最困難的問題是:我如何將兩個關聯映射到單個屬性?
用戶:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name = "User_Permission", Storage = "permissions", ThisKey = "Id", OtherKey = "UserId")] 
     public EntitySet<Permission<User>> Permissions{ ... } 

集團

[global::System.Data.Linq.Mapping.AssociationAttribute(Name = "Group_Permission", Storage = "permissions", ThisKey = "Id", OtherKey = "GroupId")] 
public EntitySet<Permission<Group>> Permissions { ... } 

權限

[global::System.Data.Linq.Mapping.AssociationAttribute(Name = "???", Storage = "holder", ThisKey = "HolderId", OtherKey = "Id", IsForeignKey = true)] 
     public T PermissionHolder { ... } 

也許我應該叫Asscoiation 「Holder_Permission」?!?

+0

您是否考慮過像數據訪問一樣使用數據庫對象,並使用一些簡單的CLR對象來管理這些更復雜的情況? – 2010-09-14 13:43:37

+0

嗨,恩瑞克,你能更精確嗎?我不明白你的意思。 – bonfo 2010-09-14 14:40:51

回答

0

我嘗試過很多不同的方法。我可以說,與LINQ-TO-SQL不可能有通用映射。

我會嘗試與Linq-To-Entity。

相關問題