所以我有这两种方法
private static void AddOrUpdate(Computer input)
{
if (Simple.Repository.Exists<Computer>(o => o.ObjectSid == input.ObjectSid))
{
Simple.Repository.Update(input);
}
else
{
Simple.Repository.Add(input);
}
}
private static void AddOrUpdate(User input)
{
if (Simple.Repository.Exists<User>(o => o.ObjectSid == input.ObjectSid))
{
Simple.Repository.Update(input);
}
else
{
Simple.Repository.Add(input);
}
}
作为练习,我想知道我是否可以使用通用方法,只需将方法更改为
private static void AddOrUpdate<T>(T input)
{
if (Simple.Repository.Exists<T>(o => o.ObjectSid == input.ObjectSid))
{
Simple.Repository.Update(input);
}
else
{
Simple.Repository.Add(input);
}
}
不起作用 - 编译器说类型T必须是引用类型。
有可能吗?甚至可取?有更好的重构吗?
public class User
{
private string _samAccountName;
[DisplayName("User Name")]
public string SamAccountName
{
get { return _samAccountName ?? "No User"; }
set { _samAccountName = value; }
}
public string UserPrincipalName { get; set; }
public string DisplayName { get; set; }
public DateTime LastLogonTimeStamp { get; set; }
[SubSonicPrimaryKey] public Guid ObjectSid { get; set; }
public Guid? ComputerGuid { get; set; }
}
and
public class Computer
{
public string DistinguishedName { get; set;}
public string DnsHostname { get; set; }
public string Description { get; set; }
public string Cn { get; set; }
public DateTime LastLogonTimeStamp { get; set; }
public String OperatingSystem { get; set; }
public string OperatingSystemServicePack { get; set; }
[SubSonicPrimaryKey] public Guid ObjectSid { get; set;}
public Guid? UserGuid { get; set; }
}
答案 0 :(得分:0)
如果计算机和用户从定义public Guid ObjectSid
的基类继承,那么您可以将通用方法定义为
private static void AddOrUpdate<T>(T input) where T : BaseClass, new()
{
if (Simple.Repository.Exists<T>(o => o.ObjectSid == input.ObjectSid))
{
Simple.Repository.Update(input);
}
else
{
Simple.Repository.Add(input);
}
}
然后离开。
答案 1 :(得分:0)
我们通过使所有SubSonic生成的类实现一个接口来完成此任务:
public interface IPersistable {
bool IsPersisted { get; }
}
IsPersisted的实现检查主键字段是否等于该类型的默认值。然后,我们在Save of of off上启动Add或Update决定。这让我们避免查询数据库以查看id是否存在。