Sorun: Birden çok derlemeler arasında kod paylaşmak istiyorum. Bu paylaşılan kodun SQL eşlemeli sınıflara LINQ ile çalışması gerekecektir.
Aynı sorunla karşılaştım İşteama aynı zamanda bir uğraş buldum da rahatsız edici buluyorum (bugüne kadar "bug" diyemiyorum).
Aşağıdaki kodların tümü indirilebilir bu çözüm.
Bu tablo verildiğinde:
create table Users
(
Id int identity(1,1) not null constraint PK_Users primary key
, Name nvarchar(40) not null
, Email nvarchar(100) not null
)
ve bu DBML eşlemesi:
<Table Name="dbo.Users" Member="Users">
<Type Name="User">
<Column Name="Id" Modifier="Override" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
<Column Name="Name" Modifier="Override" Type="System.String" DbType="NVarChar(40) NOT NULL" CanBeNull="false" />
<Column Name="Email" Modifier="Override" Type="System.String" DbType="NVarChar(100) NOT NULL" CanBeNull="false" />
</Type>
</Table>
Bir "Paylaşılan" derlemesinde aşağıdaki temel sınıfları oluşturdum:
namespace TestLinq2Sql.Shared
{
public abstract class UserBase
{
public abstract int Id { get; set; }
public abstract string Name { get; set; }
public abstract string Email { get; set; }
}
public abstract class UserBase<TUser> : UserBase where TUser : UserBase
{
public static TUser FindByName_Broken(DataContext db, string name)
{
return db.GetTable<TUser>().FirstOrDefault(u => u.Name == name);
}
public static TUser FindByName_Works(DataContext db, string name)
{
return db.GetTable<TUser>().FirstOrDefault(u => u.Name == name && 1 == 1);
}
public static TUser FindByNameEmail_Works(DataContext db, string name, string email)
{
return db.GetTable<TUser>().FirstOrDefault(u => u.Name == name || u.Email == email);
}
}
}
Bu sınıflar, başka bir derlemede "Ana" olarak adlandırılır, şöyle ki:
namespace TestLinq2Sql
{
partial class User : TestLinq2Sql.Shared.UserBase<User>
{
}
}
DBML dosyası, "Ana" derlemede de bulunur.
Çağırırken User.FindByName_Broken(db, "test")
, bir istisna atılır:
System.InvalidOperationException: Sınıf üyesi UserBase.Name unmapped.
Ancak, diğer iki temel statik yöntem çalışır.
Ayrıca, çağırarak oluşturulan SQL User.FindByName_Works(db, "test")
kırık aramada umuyorduk:
SELECT TOP (1) [t0].[Id], [t0].[Name], [t0].[Email]
FROM [dbo].[Users] AS [t0]
WHERE [t0].[Name] = @p0
-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [test]
Bunu kullanmak için istekliyim 1 == 1
Tekli yüklemeler için "kesmek", bir temel / paylaşılan / çekirdek derlemesinde SQL-bilinçli kod için LINQ paylaşmanın daha iyi bir yolu var mı?